2013-08-27 48 views

回答

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!"); 
}; 
+1

迂腐,'var functionName'被提升,但'functionName = function ...'賦值不是。 –

+0

好吧,所以var functionName = function(arg1,arg2){};會正常工作,對嗎? – Sam

+0

@Tank查看附加答案,希望現在清楚 –

3

它被稱爲'提升'。這篇文章解釋非常好:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

基本上什麼正在發生的是第一代碼片段被視爲好像它是第二:

a(); 
function a(){}; 

變得因爲函數聲明

var a = function a(){}; 
a(); 
+3

雖然你的回答是一個很好的解釋,你的第二個片段是不正確的。您需要刪除'var a ='部分,因爲這將是一個函數表達式,它與第一個片段中的函數聲明完全不同。簡單地交換第一個片段的行就足以舉例說明吊裝。 – Steve

相關問題