Javascript 可变环境';s函数 执行上下文的变量/词汇环境组件
问题1: 对于什么Javascript 可变环境';s函数 执行上下文的变量/词汇环境组件,javascript,Javascript,问题1: 对于什么VariableEnvironment执行上下文组件是必需的? 正如spec LexicalEnvironment component中所述 用于解析代码所做的标识符引用 在这个执行上下文中 但是VariableEnvironment组件用于 保存由VariableStatements和FunctionDeclarations创建的绑定 在这个执行上下文中 可以,但是对PrimaryExpression:Identifier的计算是使用LexicalEnvironment组件执
VariableEnvironment
执行上下文组件是必需的?
正如spec LexicalEnvironment component中所述
用于解析代码所做的标识符引用
在这个执行上下文中
但是VariableEnvironment
组件用于
保存由VariableStatements和FunctionDeclarations创建的绑定
在这个执行上下文中
可以,但是对PrimaryExpression:Identifier
的计算是使用LexicalEnvironment
组件执行,而不是运行执行上下文的variableevironment
:
可变环境中。在步骤5中,内部属性向外部词典环境指示。所以我有一个问题
问题2:
在创建功能代码的执行上下文之后,初始环境记录是否包含与外部的环境记录相同的绑定
将以下代码片段考虑到全局代码中
函数代码示例
问题3:
在创建bar
执行上下文之后,在开始执行函数codeVariableEnvironment
之前,它的环境记录将包含bar-->函数bar(){…},b-->{b:'b'},o-->{o:'o'}
,但是词汇环境
的环境记录问题1
VariableEnvironment是函数开头的作用域链的叶子。自从
所有变量和函数都挂在当前函数(或全局范围)的顶部,它定义了在给定函数中严格可见的标识符的范围
当您将构造与
和catch
一起使用时,词汇环境扩展了VariableEnvironment。有关更多详细信息,请参阅
这两种环境都用于名称解析。除了函数体(即函数中的函数)之外,大部分时间都在使用词汇环境,在函数体中(父函数的)应该使用VariableEnvironment
正如我在前面的回答中所说的,这种情况并不常见,各种实现的行为也不同
我不确定我是否理解您所说的“绑定存储”是什么意思。
在解析名称后,在适用的情况下(即参数传递或赋值),会进行绑定,无论哪种环境允许解析
基本上,VariableEnvironment中的名称是局部变量(分配变量时绑定到堆对象)和参数(调用函数时绑定到传递的值,如规范10.4.3的步骤8-9所述)
LexicalEnvironment中的名称要么是catch
语句的异常上下文名称,要么是with
语句的对象属性名称。当对语句求值时,它们将被绑定到相应的实例,并在语句体的末尾被释放
例如:
function stick_to_top (element)
{
with (element.style) { top = 0; }
}
stick_to_top (document.getElementById ("wanderer"));
当语句top=0时,将绑定top
在函数调用期间执行代码>
名称解析将top
解析为元素。top
使用stick_to_top()
的词法上下文,并通过with
语句进行增强,该语句将包含所有元素的名称。style
属性,并将元素
解析为stick_to_top()
的参数使用变量上下文stick_to_top()
,该变量上下文仅包含参数元素的名称
最后,值0将分配给ID为“Loverter”的DOM对象的property style.top(当然,假设getElementById()找到了它)
如果你想开个玩笑,试试这个:
var tip = { style:{top:1}};
var top = { style:'', invaluable_information:42};
var tap = { };
stick_to_top (tip);
stick_to_top (top);
console.log ("tip %o top %o", tip, top);
stick_to_top (tap);
结果:
tip [object Object] top 0
SCRIPT5007: Object expected
tip的行为与常规DOM对象类似,因为我们为其定义了style.top
属性
tap没有style
属性,因此tap.style
是未定义的
,解释器在尝试使用语句处理时抛出错误
top是不吉利的。它确实有一个style
属性,因此with语句很乐意创建一个空的词汇环境。现在,标识符top
在stick_to_top()
中找不到了,所以名称解析返回到全局上下文,在全局上下文中可以找到它
tip [object Object] top 0
SCRIPT5007: Object expected