2

某些形式的间接eval在 Opera 中失败,而且,我听说,在 Safari 中。

[eval][0]('')

未处理的错误:使用无效的此对象调用 eval

请注意,在评估空字符串时它会失败......据我所知,它应该 return undefined

其他形式,如(0,eval)(''),似乎工作正常。

运行 kangax 的这个测试套件中的示例,我看到几个表单在 Opera 中失败并显示“invalid this object”消息,但在 Chrome 或 Firefox 中没有。

谁能解释为什么会这样?是什么决定了这种行为?这似乎是故意的,它是否符合我不知道的标准的某些部分?

相关——关于间接与直接评估的讨论。

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

4

2 回答 2

2

这仅仅是因为 ECMAScript 262 第 3 版为不寻常的 eval() 调用指定了一个有点奇怪的可选异常。请参阅规范本节的最后一部分:http: //bclary.com/2004/11/07/#a-15.1.2.1

如果 eval 属性的值以任何方式使用,而不是直接调用(即,除了通过显式使用其名称作为标识符,即 CallExpression 中的 MemberExpression),或者如果 eval 属性被分配给,可能会抛出 EvalError 异常。

我不完全确定这句​​话背后的原因是什么,但是正如您所见,如果在某个对象上定义了对 eval 的引用并从那里调用,那么 Opera 的 Carakan 引擎和 Safari 的 ES 引擎都选择实现异常。

ECMAScript 标准的后续版本已经删除了这一点(首先在规范中有一个可选的例外是一个非常糟糕的主意)并且 Opera 将在未来的某些 Carakan 版本中进行调整。由于 StackOverflow 上的这些问题,它已经在内部得到修复;)

于 2012-10-10T08:30:49.267 回答
0

我猜想运行:

[eval][0]('something');

this等于函数[eval]内部的数组eval

跑步:

[eval][0].call(window, 'something');

应该this等于全局对象,但我不确定在这种情况下是否适用于那些浏览器。

于 2012-10-01T00:27:14.910 回答