某些形式的间接eval
在Opera中失败,而且,我被告知,在Safari中。
[eval][0]('')
未处理错误:使用无效此对象调用eval
请注意,在评估空字符串时它会失败...据我所知,它应该返回undefined
。
其他表单,例如(0,eval)('')
,似乎工作正常。
通过kangax运行此test suite中的示例,我看到几个表单因Opera中的“无效此对象”消息而失败,但不是Chrome或Firefox。
任何人都能解释为什么会这样吗?是什么决定了这种行为?这似乎是有意的,它是否符合我不了解的标准的某些部分?
相关 - SO discussion关于间接与直接评估。
答案 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
等于全局对象,但我不确定那些浏览器是否适用于这种情况。