首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何以严格模式进行间接评估?

如何以严格模式进行间接评估?
EN

Stack Overflow用户
提问于 2018-05-14 06:24:58
回答 1查看 0关注 0票数 0

我了解如何eval()在非严格的环境下工作,但eval()严格模式下的使用情况完全困扰着我。当eval()在全局范围内直接调用时,变量将保留在新eval()范围内:

代码语言:javascript
复制
'use strict';
eval('var a = 1;');
console.log(a); // ReferenceError: a is not defined

但是,如果我在全局范围内执行一个间接调用eval()(应该是同样的事情,对吧?),它的行为好像不是严格模式:

代码语言:javascript
复制
'use strict';
(0, eval)('var a = 1;'); // indirect call to eval
console.log(a); // 1???

至少根据我对如何eval()在严格模式下工作的理解,它意味着(无论eval()是直接还是间接调用)为eval()调用中定义的变量创建新范围,但这似乎不是这里的情况。该规范说明如下:

10.4.2输入评估代码 当控制进入eval代码的执行上下文时,执行以下步骤:

  1. 如果没有调用上下文,或者eval代码没有通过直接调用eval函数(15.1.2.1.1)进行评估, 一个。如10.4.1.1所述,使用eval代码作为C来初始化执行上下文,就好像它是全局执行上下文一样。
  2. 其他, 一个。将ThisBinding设置为与调用执行上下文的ThisBinding相同的值。 湾 将LexicalEnvironment设置为与调用执行上下文的LexicalEnvironment相同的值。 C。将VariableEnvironment设置为与调用执行上下文的VariableEnvironment相同的值。
  3. 如果eval代码是严格代码,那么 一个。让strictVarEnv成为调用NewDeclarativeEnvironment传递LexicalEnvironment作为参数的结果。 湾 将LexicalEnvironment设置为strictVarEnv。 C。将VariableEnvironment设置为strictVarEnv
  4. 执行声明绑定实例化中的说明10.5使用eval代码。
EN

回答 1

Stack Overflow用户

发布于 2018-05-14 16:03:16

你可以在以下方面看到这一点:

代码语言:javascript
复制
(function(){ "use strict"
    var x = eval;
    x("var y = 10"); // look at me all indirect
    window.y;// 10
    eval("var y = 11");
    window.y;// still 10, direct call in strict mode gets a new context
})();

这个问题可以看出:

如果eval代码是严格代码,那么(我:修复上下文)

但严格的eval代码被定义为:

如果以包含使用严格指令的指令序言开始,或者eval的调用是直接呼叫,则评估代码是严格的评估代码。

由于调用不是直接的,因此eval代码不是严格的eval代码 - 执行在全局范围内。

首先是一个很好的问题。

“评估代码”比直接或间接调用更为通用eval

让我们来看看确切规格的eval功能:

15.1.2.1 eval(x) 当使用一个参数x调用eval函数时,将执行以下步骤:

  1. 如果Type(x)不是String,则返回x。
  2. 让prog成为将x解析为程序的结果的ECMAScript代码。如果解析失败,则抛出一个SyntaxError异常(但也可参见第16节)。
  3. 让evalCtx是为eval代码编制建立新的执行上下文(10.4.2)的结果。
  4. 让结果成为评估程序的结果。
  5. 退出正在运行的执行上下文evalCtx,恢复上一个执行上下文。...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008464

复制
相关文章

相似问题

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