2

bar2 番目の console.log で何が起こっていますか? 「Andy」または参照エラーをスローするべきではありませんか? また、なぜfoo未定義ではないのですか?

クロムを使用しています。

// lexical scope example
var bar = "Andy";
try {
    console.log(bar); // Andy
    (function() {
        console.log(bar); // undefined!
        var bar = "B",
            foo = "Last Name";
        console.log(bar); // B
        console.log(foo); // Last Name
    })();
    console.log(bar); // B
    console.log(foo); // Reference Error
} catch (e) {
    console.log(e);
}​

上記の JSFiddle: http://jsfiddle.net/2D9fj/3/

4

3 に答える 3

1

コードが解析された後、var 宣言が巻き上げられます (これが、多くの開発者が vars をすべて先頭で定義する理由です)。

// lexical scope example
var bar = "Andy";
try {
    console.log(bar); // Andy
    (function() {
         var bar, foo;
        console.log(bar); // undefined!
        bar = "B";
        foo = "Last Name";
        console.log(bar); // B
        console.log(foo); // Last Name
    })();
    console.log(bar); // B
    console.log(foo); // Reference Error
} catch (e) {
    console.log(e);
}​
于 2012-05-17T15:43:30.183 に答える
0

アンドリューの答えは正しいですが、追加のコードなしで、巻き上げの概念を説明するだけの例を提供すると役立つと思います。

// this: 
function foo() {
    console.log(x);
    var x = 1;
}

//is actually interpreted like this:
function foo() {
    var x;
    console.log(x);// undefined
    x = 1;
}

また、クロージャーもこの問題に関連していますが、巻き上げエラーの特定が難しくなるだけです。

(function parent() {
  // x declared and assigned in parent scope
  var x = 2;

  function foo() {
      console.log(x); // 2 (closed around parent scope)
  }

  function bar() {
      console.log(x); // undefined (bar scope, x declaration is hoisted, but not defined yet)
      var x = 1;
  }
  function baz() {
      var x = 3;
      console.log(x); // 3 (baz scope, defined)
  }
  //run 
  foo();
  bar();
  baz();
}());
于 2012-05-18T12:47:03.267 に答える
0

で始まる行(function() {は、値がスコープ/クロージャーの外では有効でない bar、foo 変数を囲むスコープ/クロージャーを作成します

于 2012-05-17T15:42:05.710 に答える