当前位置: 首页 > 知识库问答 >
问题:

严格模式下的间接eval调用

鲜于子琪
2023-03-14
'use strict';
eval('var a = 1;');
console.log(a); // ReferenceError: a is not defined
'use strict';
(0, eval)('var a = 1;'); // indirect call to eval
console.log(a); // 1???

所有主要浏览器(包括Internet Explorer10,Chrome30和Firefox24)都是这样,所以我不认为这是一个bug。他们不是要做同样的事情吗?如果不是,为什么会这样?

注意:是的,我知道使用eval()的“危险”--我只是想理解这背后的逻辑:)

共有1个答案

况庆
2023-03-14

第二个(0,eval)('var a=1;');大小写实际上不是直接调用。

您可以在以下内容中更普遍地看到这一点:

(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 code”比直接或间接调用eval更通用。

让我们检查eval函数的确切规范

15.1.2.1货币(x)

让evalCtx成为为eval代码prog建立新的执行上下文(10.4.2)的结果。

让结果是评估程序程序的结果。

退出正在运行的执行上下文evalCtx,恢复以前的执行上下文。...

那么,在这两种情况下,memberexpression是什么呢?

eval('var a=1;');中,计算它的结果确实有一个引用名eval,并对它调用getvalue解析,返回内置函数。

(0,eval)('var a=1;');中,计算成员表达式的结果没有引用名称eval。(不过,它确实解析为GetValue上的内置函数)。

这要求我们查看GetReferencedName:

GetReferencedName(V)。返回引用V的引用名称组件。

因此,虽然表达式(0,eval)===eval为true,但在计算函数时,由于命名的原因,这实际上是一个间接调用。

 类似资料:
  • 除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法。 同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。一些在正常模式下可以运行的语句,在严格模式下将不能运行。 设计目的 早期的 JavaScript 语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,只能不

  • 概述 进入标志 如何调用 语法和行为改变 全局变量显式声明 静态绑定 增强的安全措施 禁止删除变量 显式报错 重名错误 禁止八进制表示法 arguments对象的限制 函数必须声明在顶层 保留字 参考链接 概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。 设立”严格模式“的

  • ECMAScript 5 最早引入了“严格模式”(strict mode)的概念。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致编程错误的ECMAScript 行为。 理解严格模式的规则非常重要,ECMAScript 的下一个版本将以严格模式为基础制定。支持严格模式的浏览器包括IE10+、Firefox

  • 主要内容:什么是严格模式,启用严格模式,严格模式中的变化由于 JavaScript 语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用 var 关键字来提前声明(例如: ),此时 JavaScript 解释器会自动为您创建这个变量。为了使代码更加严谨,JavaScript 中引入了严格模式,一旦使用了严格模式,将不再允许使用那些不严谨的语法。 什么是严格模式 严格模式是在 ECMAScript5(ES5)中引入的,在严格模式下,JavaS

  • 要启用严格模式,只需在创建 Vuex store 的时候简单地传入 strict: true。 const store = new Vuex.Store({ // ... strict: true }) 在严格模式下,只要 Vuex 状态在 mutation 方法外被修改就会抛出错误。这确保了所有状态修改都会明确的被调试工具跟踪。 开发阶段 vs. 发布阶段 不要在发布阶段开启严格模式! 严格

  • 问题内容: 我正在尝试使用selenium-webdriver登录facebook.com。 它给出了错误: (/home/shubham/Music/amazon_login/test_22_4_16/sel_login.js:1:79) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.