在书 Secrets of the JavaScript Ninja 中,p. 43 - 46,它有一些代码如下:
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
anywhere inside a function 表示 b
存在于函数内anywhere。这就是“吊装”。所有 var
和 function
声明都被提升到顶部,无论它们出现在范围中的什么位置。 值 尚未分配。
关于javascript - 在 JavaScript 中,当局部变量被提升时,它是否在声明之前就在范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997277/