當別人解釋功能的「吊裝」的行爲(我個人覺得叫它方面準備或預處理比吊裝更清晰)的Firefox的不同行爲的原因仍然沒有答案。
首先,您應該知道函數聲明和函數聲明之間的區別。
函數聲明,如在你的例子可能發生只在兩個地方,在全局代碼(以外的任何功能),並直接在另一個函數的函數體,例如:
function foo() {}
function bar() {
function baz() {}
}
所有上面的函數是有效的函數聲明。
ECMAScript規範不允許塊內定義在其他地方,例如函數聲明:
if (true) {
function foo() {}
}
上述功能應該給你一個SyntaxError
例外,但大多數的實現是仁慈的,他們即使實際功能無法到達(例如if (false) { function bar() {} }
),仍會預處理(提升)該功能。
在Firefox中,函數語句是允許的,也就是說,當控制達到特定的語句,比如函數定義實際情況:
if (true) {
function foo() { return true; }
} else {
function foo() { return false; }
}
執行上面的語句後foo();
,在Firefox中會產生true
,因爲if
語句的第一個分支實際執行。
在其他瀏覽器,foo();
產生false
,因爲所有的功能進行預處理進入執行上下文的時候,最後一個將優先考慮,即使if
語句的false
分支從未到達。
Firebug控制檯,執行其代碼封裝的一個try-catch
塊內,這就是爲什麼功能不可用之前其聲明。
如果試圖在控制檯上:
console.log(typeof f); // "undefined"
function f() {}
你會看到f
還沒有準備,但如果你換一個函數內部的代碼,您會看到預期的行爲:
(function() {
console.log(typeof f); // "function"
function f() {}
})();
同樣,這是因爲現在f
被定義爲函數聲明,因爲它存在於匿名函數的主體中,而不是語句塊的一部分。
來源
2011-09-07 16:33:39
CMS
什麼是控制檯輸出? – wosis