2013-02-02 63 views
16

javascript中的var關鍵字導致變量存儲在本地作用域中。沒有var變量屬於全局範圍。關於功能呢?很明顯,當函數聲明變量一樣函數聲明的javascript作用域

var foo = function() {...} 

會發生什麼,但什麼範圍呢

function foo() {...} 

屬於哪一種?

編輯: 我意識到我並沒有問很正確的問題,因此後續。在最外面的嵌套中,上面的兩個聲明和下面的聲明有區別嗎?

foo = function() {...} 

回答

25

它屬於當前範圍,總是。例如:

// global scope 

// foo is a global function 
function foo() { 

    // bar is local to foo 
    function bar() { 

    } 

} 

關於你提到的第二個問題,這一點:

foo = function() {...} 

是分配給全局變量的匿名函數表達式(除非你正在運行的是嚴格的模式,然後foo將是不確定的) 。與function foo() {}之間的區別在於後者是功能聲明(與變量聲明,其被分配了匿名函數表達式)。

您可能對這篇關於函數聲明和函數表達式的優秀文章感興趣:Named function expressions demystified

+0

這是一篇很棒的文章。謝謝。 – user1816847

+1

我忘記提到的一個顯着差異是Bergi在他的回答中所說的:函數聲明被掛起,所以你可以在函數實際出現在源代碼之前調用函數。 – bfavaretto

0

你的第一個例子(var foo = function() {...})被稱爲匿名函數。它在運行時動態聲明,並不遵循與正常函數相同的規則,但遵循變量規則。

+0

這真是令人困惑,因爲很多文檔都說「像函數一樣的對象」,而沒有對我在OP中提到的區別進行更嚴格的討論。 – user1816847

7

函數聲明對於當前作用域總是局部的,就像使用關鍵字var聲明的變量一樣。

然而,不同的是,如果他們是宣佈(而不是分配給一個變量)的定義是懸掛,所以他們會使用無處不在的範圍內,即使申報進來的結束碼。另見var functionName = function() {} vs function functionName() {}

3

值得注意的區別考慮隱含全局考慮:

var foo = function() { 
    // Variables 
    var myVar1 = 42; // Local variable 
     myVar2 = 69; // Implicit global (no 'var') 

    // Functional Expressions 
    var myFn1 = function() { ... } // Local 
     myFn2 = function() { ... } // Implicit global 

    function sayHi() { 
    // I am a function declaration. Always local. 
    } 
} 

希望這澄清了一點。如果您在分配前忘記var,則會定義隱式全局變量。它是一種適用於變量聲明和函數表達式的危險危險。