在書Secrets of the JavaScript Ninja,p。 43 - 46,它有一個像一些代碼:在JavaScript中,當局部變量被提起時,甚至在它被聲明之前它是否在範圍內?
function assert(flag, msg) {
if (!flag) {
console.log("Assertion failed for: " + msg);
}
}
function outer() {
var a = 1;
function inner() { }
assert(typeof b === "number", "b is in scope");
var b = 1;
}
outer();
而得出的結論是,因爲斷言失敗,即「B不在範圍內還沒有,直到它被宣佈」。但我認爲這是另外的,因爲首先,b
已經可以具有本地範圍,但僅僅是它不是「數字」。實際上b
已經是本地範圍b
,並且會影響任何全局b
。
例如:
var b = 123;
function foo() {
b = 456;
var b = 789;
}
foo();
console.log(b); // prints out 123
因爲它打印出123
,所以我們可以看到,在執行線b = 456;
時,b
已經是本地範圍b
。 (即使在任務尚未初始化之前)。
另外,我們可以把它打印出來,而不是分配給b
:如此反覆
var b = 123;
function foo() {
console.log(b); // prints out undefined
var b = 789;
}
foo();
console.log(b); // prints out 123
,我們可以看出,首次印出不是123
但undefined
,這意味着b
是局部範圍b
,因此,b
確實已經在書中的範圍內。
上述說明和概念是否正確?
'var b'被懸掛在函數作用域的頂部,所以後面的'b'在函數中引用本地'b',而不管順序如何。 – Blender 2013-02-21 08:06:08
那麼這本書的描述是錯誤的?你是什麼意思「功能範圍的頂部」?(範圍是範圍,沒有範圍的頂部或底部)。你的意思是「懸掛在函數的頂部(就像它是第一行一樣,並且在函數的本地範圍內,而不管它在函數內部出現的位置嗎?」) – 2013-02-21 08:08:56
我不喜歡術語「提升」,它表示聲明是移到了某個東西的頂端,這並不是實際發生的事情,標準解釋了它(http://ecma-international.org/ecma-262/5.1/#sec-10.4),因爲所有的聲明都是在之前處理的任何代碼都會被執行,所以這也是你應該考慮的問題,對範圍的影響是副作用 – RobG 2013-02-21 08:25:01