javascript中的var
關鍵字導致變量存儲在本地作用域中。沒有var
變量屬於全局範圍。關於功能呢?很明顯,當函數聲明變量一樣函數聲明的javascript作用域
var foo = function() {...}
會發生什麼,但什麼範圍呢
function foo() {...}
屬於哪一種?
編輯: 我意識到我並沒有問很正確的問題,因此後續。在最外面的嵌套中,上面的兩個聲明和下面的聲明有區別嗎?
foo = function() {...}
javascript中的var
關鍵字導致變量存儲在本地作用域中。沒有var
變量屬於全局範圍。關於功能呢?很明顯,當函數聲明變量一樣函數聲明的javascript作用域
var foo = function() {...}
會發生什麼,但什麼範圍呢
function foo() {...}
屬於哪一種?
編輯: 我意識到我並沒有問很正確的問題,因此後續。在最外面的嵌套中,上面的兩個聲明和下面的聲明有區別嗎?
foo = function() {...}
它屬於當前範圍,總是。例如:
// 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。
你的第一個例子(var foo = function() {...}
)被稱爲匿名函數。它在運行時動態聲明,並不遵循與正常函數相同的規則,但遵循變量規則。
這真是令人困惑,因爲很多文檔都說「像函數一樣的對象」,而沒有對我在OP中提到的區別進行更嚴格的討論。 – user1816847
函數聲明對於當前作用域總是局部的,就像使用關鍵字var
聲明的變量一樣。
然而,不同的是,如果他們是宣佈(而不是分配給一個變量)的定義是懸掛,所以他們會使用無處不在的範圍內,即使申報進來的結束碼。另見var functionName = function() {} vs function functionName() {}。
值得注意的區別考慮隱含全局考慮:
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
,則會定義隱式全局變量。它是一種適用於變量聲明和函數表達式的危險危險。
這是一篇很棒的文章。謝謝。 – user1816847
我忘記提到的一個顯着差異是Bergi在他的回答中所說的:函數聲明被掛起,所以你可以在函數實際出現在源代碼之前調用函數。 – bfavaretto