在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/