我们有一个简单的脚本:
obj=new String('str');//1
obj.length;//2
在第1行,我们有一个简单的赋值,其评估如下:
obj
)。结果将返回(undefined, obj, false)
。new String('str');
。用rref
GetValue(rref)
此行obj-->'str'
绑定不会添加到任何执行上下文的环境记录。但是,当obj
PrimaryExpression:Identifier
被评估为('str', obj, false)
类型时,我们可以通过此引用获取'str'
的属性。
问题:
为什么第2行的PrimaryExpression:Identifier
obj
会被评估为('str', obj, false)
?
答案 0 :(得分:1)
对于SO来说,这是一个不同寻常的问题,但仍然很有趣。
你的问题的答案是它被添加到全局执行上下文中(假设这个脚本是整个程序)。
请参阅ecma spec section regarding Programs。
步骤3为全局代码设置执行上下文,这是最初引用obj
的上下文,PutValue
操作在上面的步骤4中设置绑定。