新函数和eval之间的奇怪交互

use*_*215 5 javascript firefox

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

new Function("eval('function foo(){ alert() }'); foo()")()
Run Code Online (Sandbox Code Playgroud)

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

小智 -1

问题是它eval不继承全局作用域,因此foo是在与调用它的作用域不同的作用域中创建的。您可以通过在函数定义中或通过传递给eval. 即以下两个片段均按预期工作:

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

new Function("eval('function foo(){ alert() }', this); foo()")()
Run Code Online (Sandbox Code Playgroud)

这种行为似乎与严格模式有关,正如这里的答案“use strict”所解释的那样;+ jQuery.getScript() = 脚本无法导出到全局命名空间