说,当控制进入执行 上下文中包含的功能对象楼提供thisArg呼叫者 功能代码,并提供argumentsList呼叫者执行下面的步骤:
- 如果功能代码是严格代码,请将ThisBinding设置为thisArg。
- 否则,如果thisArg为null或未定义,请将ThisBinding设置为全局对象。
- 否则,如果Type(thisArg)不是Object,请将ThisBinding设置为ToObject(thisArg)。
- 否则将ThisBinding设置为thisArg。
- 让localEnv是调用NewDeclarativeEnvironment传递F的[[Scope]]内部属性值作为 参数的结果。
- 将LexicalEnvironment设置为localEnv。
- 将VariableEnvironment设置为localEnv。
- 设代码为F的[[Code]]内部属性的值。
- 使用10.5中描述的功能代码和argumentsList执行声明绑定实例化。
考虑下面的代码片段:
function foo(){
var a={p:'p'};
o={c:'c'};
}
因此,我们有以下几点:
我们的函数的- 码心不是一个严格的代码
thisArg
为空,因此,ThisBinding
设置为全局对象- ---
- ---
- 我不明白什么绑定将包含
environment record
代表[[Scope]]
代表内部财产。 - 设置
LexicalEnvironment
到geted在步骤5. - 环境设置
VariableEnvironment
到在步骤5 - geted执行声明绑定instatiation环境。
在步骤8在VariableEnvironment中创建绑定,但不在LexicalEnvironment中创建绑定。但在sec 10.3说,
当一个执行上下文中创建了LexicalEnvironment和 VariableEnvironment组件最初具有相同的值。
问:
为什么刚过执行上下文LexicalEnvironment和VariableEnvironment的创作仍然在我上面的情况一样的吗?
我不确定我是否理解这个问题。 'LexicalEnvironment'和'VariableEnvironment'获得在6和7中分配的相同值。 –
@Felix Kling在上下文创建步骤8中,代码中声明的变量和函数将作为VariableEnvironment的环境记录中的绑定添加。但是词汇环境呢?在第8步将此绑定添加到LexicalEnvironment中吗?在我的具体情况下,函数的[[范围]]内部属性是什么? –
这是一个很好的问题。我会假设它与对象类似:LexicalEnvironment和VariableEnvironment指向相同的环境,因此通过这两个组件都可以看到对该环境所做的任何更改。在你的例子中,'[[Scope]]'会引用全局执行上下文的词法环境,因为你在全局范围中定义了这个函数。请参阅http://www.ecma-international.org/ecma-262/5.1/#sec-13 –