函數(shù)是JavaScript中的一等對(duì)象,這意味著可以把函數(shù)像其它值一樣傳遞。 一個(gè)常見的用法是把匿名函數(shù)作為回調(diào)函數(shù)傳遞到異步函數(shù)中。
function foo() {}
上面的方法會(huì)在執(zhí)行前被解析(hoisted),因此它存在于當(dāng)前上下文的任意一個(gè)地方, 即使在函數(shù)定義體的上面被調(diào)用也是對(duì)的。
foo(); // 正常運(yùn)行,因?yàn)閒oo在代碼運(yùn)行前已經(jīng)被創(chuàng)建
function foo() {}
var foo = function() {};
這個(gè)例子把一個(gè)匿名的函數(shù)賦值給變量 foo。
foo; // 'undefined'
foo(); // 出錯(cuò):TypeError
var foo = function() {};
由于 var 定義了一個(gè)聲明語(yǔ)句,對(duì)變量 foo 的解析是在代碼運(yùn)行之前,因此 foo 變量在代碼運(yùn)行時(shí)已經(jīng)被定義過(guò)了。
但是由于賦值語(yǔ)句只在運(yùn)行時(shí)執(zhí)行,因此在相應(yīng)代碼執(zhí)行之前, foo 的值缺省為undefined。
另外一個(gè)特殊的情況是將命名函數(shù)賦值給一個(gè)變量。
var foo = function bar() {
bar(); // 正常運(yùn)行
}
bar(); // 出錯(cuò):ReferenceError
bar 函數(shù)聲明外是不可見的,這是因?yàn)槲覀円呀?jīng)把函數(shù)賦值給了 foo;
然而在 bar 內(nèi)部依然可見。這是由于 JavaScript 的命名處理所致,
函數(shù)名在函數(shù)內(nèi)總是可見的。
注意:在IE8及IE8以下版本瀏覽器bar在外部也是可見的,是因?yàn)闉g覽器對(duì)命名函數(shù)賦值表達(dá)式進(jìn)行了錯(cuò)誤的解析, 解析成兩個(gè)函數(shù)
foo和bar