與鴨舌Flynn的註釋行,解析器預掃描和/或它的實際執行之前編譯代碼。因此,它可以檢測塊中任意行的變量作用域,執行或不執行。在瀏覽器的控制檯
運行以下命令:
var f = function() {
// we haven't defined a local x yet, so we're tempted to think
// that this line is mucking with window.x
x = 1;
console.log(x, window.x);
return;
// and we're tempted to think this line is never seen, because it
// occurs after the return. but, it ensures that x is local, not global.
var x = 2;
};
f();
在控制檯,你會看到這樣的內容:
1 undefined
而且事後,window.x
不存在。由於我們的聲明 - 這個聲明的賦值部分是否必要,我沒有把它提到任何地方,我不確定。它不應該。但是,如果知道某個版本的IE在賦值不存在的情況下忽略該聲明,我也不會感到驚訝。
比較它這樣的:
var f = function() {
x = 1;
console.log(x, window.x);
return;
x = 2; // this line truly does nothing.
};
f();
我們看到在控制檯:
1 1
而且事後,windows.x
是1
。
這也是值得注意的是,definedAfter()
工作正常,因爲它不是寫在變量賦值形式:
// this puts definedAfter in scope, but it's undefined unless this line is
// actually executed
var definedAfter = function() { /* whatever */ }
相反,它寫在「函數聲明」的形式,這並沒有得到「執行。「
function definedAfter() { /* whatever */ }
相反,編譯器在編譯期間看到它,說:‘哦,這個功能範圍的一部分。’這種差異,給您在變量賦值語法來精確控制,當你的功能的能力可以使用。而在函數聲明的形式,在任何地方定義功能,而不必擔心執行順序。
'x'應該是'undefined',不'null' ... –
聲明順序並不影響JavaScript的範圍,但執行順序規則應該仍然佔上風,它不會被設置,我很確定。 –