8.1.1.1.5 SetMutableBinding ( N, V, S )
用于声明性环境记录的具体环境记录方法 SetMutableBinding 试图将名称为参数 N 的值的标识符的当前绑定的绑定值更改为参数 V 的值。对于 N 的绑定通常已经存在,但是很少情况可能不会如此。 如果绑定是不可变绑定,如果 S 为真,则抛出 TypeError。
- 使 envRec 变为调用该方法的声明性环境记录。
- 如果 envRec 没有 N 的绑定,那么
a. 如果 S 为 true,则抛出一个 ReferenceError 错误。
b. 执行 envRec.CreateMutableBinding(N, true)。
c. 执行 envRec.InitializeBinding(N, V)。
d. 返回 NormalCompletion(empty)。
3.如果在 denver 中 N 的绑定是严格绑定,则设为 S。
4.如果 envRec 中的 N 的绑定尚未初始化,则抛出 ReferenceError 异常。
5.否则,如果denver中的N的绑定是可变绑定,则将其绑定值更改为 V。
6.否则,
a. 断言:这是一个尝试更改不可变绑定的值。
b. 如果 S 为 true,则抛出一个 TypeError 异常。
7.返回 NormalCompletion(empty)。
注意:导致在步骤2丢失绑定的ECMAScript代码的示例是:
function f(){eval("var x; x = (delete x, 0);")}