2

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

上記の説明と概念は正しいですか?

4

2 に答える 2

5

確かに、本の結論は間違っています。var b 関数内のどこにでもあるということは、関数内のどこbにでも存在することを意味します。それが「吊り上げ」です。すべてのand宣言は、スコープ内のどこで発生しても、一番上に持ち上げられます。はまだ割り当てられていません。varfunction

于 2013-02-21T08:11:50.100 に答える
2

コードについて:

assert(typeof b === "number", "b is in scope");
var b = 1;

ステートメント:

「宣言されるまで、b はまだスコープ内にありません」

間違っている。bは「スコープ内」です (宣言されているため、コードが実行される前に作成されます) が、まだ値が割り当てられていないため、typeof b戻りundefined、テストは失敗します。

上記の説明と概念は正しいですか?

はい、多かれ少なかれ。より簡単な証明は次のとおりです。

function foo() {
  alert(b);
  var b = 5;
}

function bar() {
  alert(x);
  x = 5;
}

foo() // 'undefined' since b is "in scope" but hasn't been assigned a value yet

bar() // throws an error since x isn't "in scope" until the following line.
于 2013-02-21T08:39:03.757 に答える