为什么(0 || eval)在Opera中不被视为间接?

时间:2012-10-01 01:00:24

标签: javascript eval opera strict-mode

在严格模式下,对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?

1 个答案:

答案 0 :(得分:3)

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

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