为什么Opera和Safari中某些形式的间接评估失败?

时间:2012-10-01 00:21:32

标签: javascript eval

某些形式的间接eval在Opera中失败,而且,我被告知,在Safari中。

[eval][0]('')
  

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

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

其他表单,例如(0,eval)(''),似乎工作正常。

通过kangax运行此test suite中的示例,我看到几个表单因Opera中的“无效此对象”消息而失败,但不是Chrome或Firefox。

任何人都能解释为什么会这样吗?是什么决定了这种行为?这似乎是有意的,它是否符合我不了解的标准的某些部分?

相关 - SO discussion关于间接与直接评估。

另外 - Why is (0 || eval) not treated as indirect in Opera?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

我猜想跑步:

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

会使this等于[eval]函数内的eval数组。

运行:

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

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