2
A
回答
6
那吊裝。所有函數聲明都被提升到包含範圍的頂部。一個函數的聲明看起來像:
function functionName(arg1, arg2){
..code here
}
這就是你可以調用該功能之前,它實際上已經在你的代碼中聲明的原因。
但請注意,函數表達式不會被懸掛。因此,下列哪一項不是懸掛:
var functionName = function(arg1, arg2){
..code here
};
所以下面將拋出錯誤:
functionName(); //TypeError, undefined is not a function!
var functionName = function(arg1, arg2) {
console.log(arg1);
};
新增:: 考慮函數表達式::
saySomething(); //You get error here
var saySomething = function() {
console.log("Hi there!");
};
的例子這將不會工作和拋出錯誤,因爲變量聲明和函數聲明被提起,但是在函數expressi的上面例子中它的變量聲明和賦值。變量聲明被掛起,但分配仍然在原來的位置。所以結果會是這樣的:
var saySomething;
saySomething(); //you get error here, which should be clear now as why you get the error
saySomething = function() {
console.log("Hi there!");
};
3
它被稱爲'提升'。這篇文章解釋非常好:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
基本上什麼正在發生的是第一代碼片段被視爲好像它是第二:
a();
function a(){};
變得因爲函數聲明
var a = function a(){};
a();
+3
雖然你的回答是一個很好的解釋,你的第二個片段是不正確的。您需要刪除'var a ='部分,因爲這將是一個函數表達式,它與第一個片段中的函數聲明完全不同。簡單地交換第一個片段的行就足以舉例說明吊裝。 – Steve
相關問題
- 1. 被調用後,被調用的函數如何返回給調用者?
- 2. 如何創建一個調用者/被調用者圖?
- 3. 被調用者是否可以強制其調用者在python中返回?
- 4. 如果被調用者被定義爲變量,JavaScript函數能夠知道調用它的是什麼嗎?
- 5. JavaScript:被調用者是什麼?
- 6. 調用者/被調用者不匹配簽名的gcc函數調用語義
- 7. 調用者沒有被
- 8. 電話被拒絕被調用者
- 9. mySQL在被定義並在調用之後沒有調用
- 10. 處理調用者或被調用者的數據?
- 11. 從被調用者返回(終止)調用者函數
- 12. ToList()負責調用者或被調用者?
- 13. 參數檢查調用者和被調用者之間的責任?
- 14. 如何調用函數調用,如果它被定義爲var?
- 15. 如何解決「調用者未被服務認證」?
- 16. C++如果被調用者刪除調用者會發生什麼?
- 17. 你可以從被調用者那裏得到調用者的DLL或可執行模塊
- 18. QScriptEngineAgent - 獲取被調用者名稱
- 19. 向「未定義方法調用」錯誤提供被調用者響應?
- 20. 爲什麼自定義回調在收益請求時不被調用,但是解析方法被調用?
- 21. AfterTextChanged即使在刪除收聽者後仍然被調用
- 22. javascript google maps Geocoder調用者函數在被調用函數前結束
- 23. 什麼是被調用者和調用者保存的寄存器?
- 24. Qt/C++ - 關於調用者/被調用者,對象所有權的困惑
- 25. jslint clickHandler在它被定義之前被使用/已經定義
- 26. 爲什麼testServiceTestCaseSetupProperly(...)在自定義測試之後被調用?
- 27. 蟒蛇多進程調用者(以及被叫)在Windows XP中多次調用
- 28. 軟鍵盤的實現可以決定它的調用者嗎?
- 29. 爲什麼我的Windsor安裝者之一被調用兩次?
- 30. 從調用者處理被調用方法中的流
迂腐,'var functionName'被提升,但'functionName = function ...'賦值不是。 –
好吧,所以var functionName = function(arg1,arg2){};會正常工作,對嗎? – Sam
@Tank查看附加答案,希望現在清楚 –