在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
再一次,我们可以看到第一个打印输出 is not 123
but is undefined
,这意味着 theb
是一个本地范围b
,因此,b
在本书的示例中,真的已经在范围内。
上述描述和概念是否正确?