首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用上下文时的声明实例化是计算形式参数初始化器

调用上下文时的声明实例化是计算形式参数初始化器
EN

Stack Overflow用户
提问于 2021-06-06 04:13:16
回答 1查看 66关注 0票数 3

PerformEval抽象操作下面的注意事项是:

在调用上下文的变量环境中,如果调用上下文正在计算形式参数初始化器,或者调用上下文的代码是严格模式代码,则调用上下文的变量或函数绑定不能实例化。相反,这样的绑定是在一个新的VariableEnvironment中实例化的,而这个新的绑定只可由eval代码访问。由let、const或类声明引入的绑定总是在新的LexicalEnvironment中实例化。

问题:

什么是“如果调用上下文正在计算形式参数初始化器”?什么是“参数初始化器”?

9.2.10附注3规范中,只有一种对术语“参数初始化器”的引用。这张便条说:

参数初始化器可能包含直接的eval表达式。这类级别的任何顶级声明都只能在eval代码(10.2)中看到。14.1.22描述了为此类声明创建环境的情况。

我将此解释为,如果参数初始化器表达式包含eval调用,则在该eval调用中创建的任何变量都不会在参数范围内实例化。因此,在下面的示例中,我希望抛出一个ReferenceError,因为不应该在参数范围内实例化c

代码语言:javascript
复制
function t(a = eval('var c = 8'), b = () => c) {
  console.log(b())
}

t() // 8 

但是,从控制台输出中可以看到,我的解释是不正确的。即使c是在eval调用中创建的,它的值在b定义的funarg中仍然是可见的,因此可以打印到控制台。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-06 05:49:49

原来你发现了一个规范错误!我在to 39的“黑客帝国聊天”( Matrix )中问过,他们创建了一个公关来删除这张便条:

https://github.com/tc39/ecma262/pull/2428

注释中的行为过去是正确的,但在2017年https://github.com/tc39/ecma262/pull/1046中删除了

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67855714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档