在JavaScript中,是否在创建与该函数关联的ExecutionContext之前或之后进行吊装?

我以前假设,如果是这样,什么时候?

function foo() {
 bar();
 var x; // When is this hoisted?
 function x() {} // ...and when is this hoisted?
};

foo();


编辑:换一种说法,我相信在运行一行代码之前,将根据程序代码中作用域的嵌套实例化对象图。运行之前是否将提升信息存储在该对象图中?

最佳答案

提升是建立执行上下文的一部分:


  [[Call]]
  
  当使用this值和参数列表调用功能对象F的[[Call]]内部方法时,将执行以下步骤:
  
  
  令funcCtx为使用F的[[FormalParameters]]内部属性的值,传递的参数List args和10.4.3中所述的this值为功能代码建立新的执行上下文的结果。
  令result为评估FunctionBody的结果,FunctionBody是F的[[Code]]内部属性的值。如果F没有[[Code]]内部属性,或者其值为空的FunctionBody,则结果为(正常,未定义,为空)。
  [...]
  


因此,当函数执行时,首先创建其执行上下文,然后评估函数主体。第10.4.3节介绍了如何发生这种情况:


  Entering Function Code
  
  当控制进入功能对象F中包含的功能代码的执行上下文,调用者提供thisArg和调用者提供argumentsList时,执行以下步骤:
  
  
  如果功能代码是严格代码,则将ThisBinding设置为thisArg。
  否则,如果thisArg为null或未定义,则将ThisBinding设置为全局对象。
  否则,如果Type(thisArg)不是Object,则将ThisBinding设置为ToObject(thisArg)。
  否则将ThisBinding设置为thisArg。
  令localEnv为调用NewDeclarativeEnvironment的结果,并传递F的[[Scope]]内部属性的值作为参数。
  将LexicalEnvironment设置为localEnv。
  将VariableEnvironment设置为localEnv。
  令code为F的[[Code]]内部属性的值。
  如10.5中所述,使用功能代码和argumentsList执行声明绑定实例化。
  


提升在步骤9中进行,并在section 10.5中进行详细说明。特别:


  5.对于代码中的每个FunctionDeclaration f,按源文本顺序执行...
  [...]
  8.对于代码中的每个VariableDeclaration和VariableDeclarationNoIn d,请按源文本顺序执行...


因此,在变量声明之前先悬挂函数声明。

关于javascript - JavaScript的起吊时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29499473/

10-12 05:40