JS的新手,试图了解吊装

时间:2012-12-04 09:04:52

标签: javascript undefined hoisting

  

可能重复:
  Redeclare JavaScript Variable

我有下一段代码:

var i = 11;
alert(i);
function a(){
    alert(i);
    var i = 2;
    alert(i);
}
a()

第二个alert(i)(在函数内部)产生undefined。我猜测它与JS引擎运行代码的方式有关 - 也许它不会先存储变量,然后再进行操作?

无论如何我认为这不是问题,因为JS支持吊装。我可能错了 - 有人在乎解释吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

JavaScript确实将声明提升到它们发生的范围的顶部,但是分配发生在您期望它们的位置。您的代码有效地解析如下:

/* Function declarations are hoisted first, which is why you can invoke a
   function before it appears to be defined in the source */
function a() {
    var i; // Declaration is hoisted (this i shadows the outer i)
    alert(i);
    i = 2; // Assignment to local i happens in place
    alert(i);
}
var i; // Declaration is hoisted (at this point, i === undefined)
i = 11; // Assignment happens in place
alert(i);
a();

详细in the spec。输入新的执行上下文后,会发生以下情况:

  

对于代码中的每个 VariableDeclaration VariableDeclarationNoIn d ,在源文本顺序中执行

     
      
  • dn 成为 d 中的标识符
  •   
  • varAlreadyDeclared 成为调用 env的 HasBinding具体方法传递 dn 作为参数的结果。
  •   
  • 如果 varAlreadyDeclared false,那么   
        
    • 调用 env的 CreateMutableBinding具体方法,将 dn configurableBindings 作为参数传递。
    •   
    • 调用 env的 SetMutableBinding具体方法,将 dn undefined strict 作为参数传递。
    •   
  •