新函数和评估之间的奇怪交互

时间:2015-05-18 23:07:49

标签: javascript firefox

为什么这行代码失败有什么理由?

new Function("eval('function foo(){ alert() }'); foo()")()

它按照预期在Chromium中弹出一个警告,但在Firefox中失败(foo未定义)。这是Firefox的错误,还是我的代码有问题?

1 个答案:

答案 0 :(得分:-1)

问题是eval没有继承全局范围,因此foo创建的范围与调用范围不同。您可以通过在函数定义中明确指定范围或传递给eval来解决此问题。即以下两个片段都按预期工作:

new Function("eval('window.foo = function(){ alert() }'); foo()")()

new Function("eval('function foo(){ alert() }', this); foo()")()

此行为似乎与严格模式有关,正如此处"use strict"; + jQuery.getScript() = script can't export to global namespace的答案所解释的那样。