Email:longsu2010 at yeah dot net
我將描述一個JavaScript的古怪問題。幸運的是我之前從未在實際工作中出現問題。我確信function a(){}和var a = function (){}是完全相同的的。
其實我錯了,兩者有很大的不同,看下面的例子。
var a = 5;
if (a == 5) {
var b = function () {
return "obvious";
};
} else {
var b = function () {
return "never";
};
}
if (a == 5) {
function c() {
return "expected";
}
} else {
function c() {
return "surprise!";
}
function d() {
return "how come?";
}
}
alert(b());
alert(c());
alert(d());
你可能說運行結果是“obvious”, “surprise!” and “how come?”,一般來說是正確的,除了Firefox。如果你定義一個命名函數,無論函數定義代碼出現在什么位置解析器都會在當前作用域中創建該函數。因此你需要提防這樣的代碼,同時不要忘記瀏覽器檢測。
另外的一個不同是函數c的name屬性值為"c"而b的name屬性為"".
c.name == "c";
b.name == "";
譯者:
本文闡述了函數聲明與函數表達式的區別,同時闡述了在不同瀏覽器中的差別。這個差別之前我就知道,遇到的機會確實不多。
一般來說JavaScript進入到某一作用域時會優先處理函數聲明(不包括函數表達式,函數表達式屬于聲明變量)、形參和變量聲明(不包括賦值,所以在正式賦值前變量的值都是undefined)。
所以在函數聲明代碼之前調用該函數是沒有問題的,如果在函數表達式代碼之前調用函數表達式所定義的函數是會報錯的,因為在調用的時候函數表達式聲明的變量值是undefined。
具體在之前的博客你自認為理解了JavaScript?中有所闡述。
如上所述在Firefox中有所不同,輸出結果將是“obvious”, “expected”之后報一個沒定義的錯。看了結果就知道Firefox是怎么做的了。
相關文章:
JavaScript中的對象(一)