JavaScript忍者の秘密の本の中で、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;bb
また、に代入する代わりに印刷することもできますb:
var b = 123;
function foo() {
console.log(b); // prints out undefined
var b = 789;
}
foo();
console.log(b); // prints out 123
繰り返しになりますが、最初の出力は is not 123but isであることがわかります。これは、 がローカル スコープであることundefinedを意味します。したがって、本の例では、実際には既にスコープ内にあります。bbb
上記の説明と概念は正しいですか?