不必要的吊装正在发生.为什么?

Raj*_*amy 0 javascript

function test() {
    a = 10;
    alert(a);
    if (false) {
        var a;
    }
}

test();
Run Code Online (Sandbox Code Playgroud)

从上面的代码中,您可以看到我在falsy if语句中声明了一个变量,这意味着它内部的代码不会被执行.看,现在变量是不必要的悬挂,为什么会这样......?它会不必要地分配内存.是不是编译器足够聪明地识别它..?或者这些变量是否会像垃圾一样收集垃圾.

给定的代码块将被解释为,

function test() {    
    var a;
    a = 10;
    alert(a);
    if (false) {   
    }    
}

test();
Run Code Online (Sandbox Code Playgroud)

逻辑上,从变量语句中提取变量的用途是什么?如果在var a;内部分配任何内存,那么这不是一个优化的权利..?

Syl*_*ook 5

Mozilla的例子更多地讨论了变量提升

你会注意到的

function test() {
  a = 10;
  alert("Function a=" + a);
  if (false) {
    var a;
  }
}

test();
alert("Global a=" + a);
Run Code Online (Sandbox Code Playgroud)

给出了"全局"行中没有定义的错误,因为作用域,你不会继续

function test() {
  a = 10;
  alert("Function a=" + a);
}

test();
alert("Global a=" + a);
Run Code Online (Sandbox Code Playgroud)

因此,根据文档中的说明,您的代码等于:

function test() {
  var a;
  a = 10;
  alert(a);
  if (false) {
  }
}

test();
Run Code Online (Sandbox Code Playgroud)

因为在执行任何其他代码之前处理声明.

  • @bitoiu - 实际上它不输出`undefined`.它给出了一个错误:`ReferenceError:a未定义`.你可以在运行时在控制台中看到:http://jsfiddle.net/jfriend00/LHe8U/.如果您尝试访问不存在的全局变量,那就会发生这种情况,除非您将它们限定为`window.a`,这将是`undefined`. (3认同)