PerformEval抽象操作下面的注意事项是:
在调用上下文的变量环境中,如果调用上下文正在计算形式参数初始化器,或者调用上下文的代码是严格模式代码,则调用上下文的变量或函数绑定不能实例化。相反,这样的绑定是在一个新的VariableEnvironment中实例化的,而这个新的绑定只可由eval代码访问。由let、const或类声明引入的绑定总是在新的LexicalEnvironment中实例化。
问题:
什么是“如果调用上下文正在计算形式参数初始化器”?什么是“参数初始化器”?
在9.2.10附注3规范中,只有一种对术语“参数初始化器”的引用。这张便条说:
参数初始化器可能包含直接的eval表达式。这类级别的任何顶级声明都只能在eval代码(10.2)中看到。14.1.22描述了为此类声明创建环境的情况。
我将此解释为,如果参数初始化器表达式包含eval调用,则在该eval调用中创建的任何变量都不会在参数范围内实例化。因此,在下面的示例中,我希望抛出一个ReferenceError,因为不应该在参数范围内实例化c:
function t(a = eval('var c = 8'), b = () => c) {
console.log(b())
}
t() // 8 但是,从控制台输出中可以看到,我的解释是不正确的。即使c是在eval调用中创建的,它的值在b定义的funarg中仍然是可见的,因此可以打印到控制台。
发布于 2021-06-06 05:49:49
原来你发现了一个规范错误!我在to 39的“黑客帝国聊天”( Matrix )中问过,他们创建了一个公关来删除这张便条:
https://github.com/tc39/ecma262/pull/2428
注释中的行为过去是正确的,但在2017年https://github.com/tc39/ecma262/pull/1046中删除了
https://stackoverflow.com/questions/67855714
复制相似问题