JavaScript 变量范围不期望结果

JavaScript variable scoping not expecting result

本文关键字:期望 结果 范围 变量 JavaScript      更新时间:2023-09-26

第二个控制台上的bar发生了什么.log?不应该是"安迪"或抛出引用错误吗?另外,为什么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/

var 声明被提升,解析后你的代码看起来像,(这就是为什么许多开发人员在顶部定义他们的变量)

// 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);
}​

(function() { 开头的行创建一个范围/闭包,该范围/闭包包含栏,其值在范围/闭包之外无效的 foo var

Andrew 的回答是正确的,但我认为提供一个仅说明吊装概念的示例而没有额外的代码会很有用。

// 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();
}());