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;
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
を意味します。したがって、本の例では、実際には既にスコープ内にあります。b
b
b
上記の説明と概念は正しいですか?