【问题标题】:Why is (0 || eval) not treated as indirect in Opera?为什么 (0 || eval) 在 Opera 中不被视为间接?
【发布时间】:2012-10-01 01:00:23
【问题描述】:

在严格模式下,对eval 的间接调用应该将this 绑定到eval 代码中的全局对象。

10.4.2:在第 5 版中,对 eval 函数的间接调用使用全局环境作为 eval 代码的变量环境和词法环境。在第 3 版中,间接 eval 调用者的变量和词法环境被用作 eval 代码的环境。

然而,在 Opera 中,这个表达式的结果是 undefined

(function(){'use strict'; return (0 || eval)('this'); }())

Chrome 和 Firefox 按预期工作。

我在这里找到了这个:http://kangax.github.com/jstests/indirect-eval-testsuite/

这是浏览器错误吗?如果有,是否正在跟踪?

另见Why do some forms of indirect eval fail in Opera and Safari?

【问题讨论】:

  • 尝试评估其他东西,例如警报。如果它会起作用,那就是歌剧的问题。
  • @Zaffy 我不确定你的意思...alert 将起作用,无论this 是否指的是全局对象。
  • 哦,对不起,我认为 eval 不能在严格模式下使用。对不起,我的愚蠢。
  • 似乎是一个错误。有趣的是,我在 Opera 中运行了 test262 suite,但它似乎没有收到它。也许他们错过了一个测试。为了确定,我再次运行它。

标签: javascript eval opera strict-mode


【解决方案1】:

Opera 的 ECMAScript 引擎似乎在这里进行了一些过度优化,其中“(0||eval)”在编译之前被简化为“eval”。在这种情况下,这种优化引入了一个错误,因为它改变了代码的行为。

(在 Opera 内部,我们将此问题跟踪为 CORE-47727)

【讨论】:

  • 谢谢,我认为这可能是问题所在,但很高兴听到确认。你知道这里发生了什么吗:stackoverflow.com/questions/12666272?这让我很困惑,因为你在 Safari 中得到了相同的行为,而且看起来是故意的,但似乎并不符合 ES5。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多