Javascript 新函数和eval之间的奇怪交互
这行代码失败有什么原因吗Javascript 新函数和eval之间的奇怪交互,javascript,firefox,Javascript,Firefox,这行代码失败有什么原因吗 new Function("eval('function foo(){ alert() }'); foo()")() 它按预期在Chromium中弹出警报,但在Firefox中失败(未定义foo)。这是Firefox的错误,还是我的代码有问题?问题是eval没有继承全局范围,因此foo是在与调用它的位置不同的范围内创建的。您可以通过在函数定义处或通过传递到eval明确指定范围来解决此问题。即,以下两个代码段均按预期工作: new Function("eval('win
new Function("eval('function foo(){ alert() }'); foo()")()
它按预期在Chromium中弹出警报,但在Firefox中失败(未定义foo)。这是Firefox的错误,还是我的代码有问题?问题是
eval
没有继承全局范围,因此foo
是在与调用它的位置不同的范围内创建的。您可以通过在函数定义处或通过传递到eval
明确指定范围来解决此问题。即,以下两个代码段均按预期工作:
new Function("eval('window.foo = function(){ alert() }'); foo()")()
new Function("eval('function foo(){ alert() }', this); foo()")()
正如这里的答案所解释的,这种行为似乎与严格模式有关。这听起来像是严格/非严格模式的事情-您确定您在非严格模式下运行了这两种模式吗?(Chrome的行为)还是严格模式(Firefox的)?(更新:看看规范,这可能是es5对es2015(es6)的事情)@BenjaminGruenbaum我想了想。我很确定我都是在非严格模式下运行的。但严格模式无论如何都不会有任何影响,因为新功能不应该反映这一点(与常规功能不同)。好吧,我不知道firefox为什么会这样做——并且(见本节中的30 b)说Chrome就在这里,除非我读错了什么。事实上,正如我发现的bug报告所示,它已经快2年了,所以我不希望这个问题很快得到解决。@Bergi我做了一些更好的事情。我修好了。它目前正在夜间建造中。为了安全起见,我会等几天,然后发布一个答案。
eval
不是用来使用全局作用域的,而是用来调用它的局部函数作用域(在该函数中,调用了foo()
)。另外,您的第二个代码段也没有意义,eval
不接受第二个参数。它实际上接受。然而,第二个参数似乎已被弃用,因此不应依赖于它的实现(尽管我在最新版本的Firefox中对其进行了测试,并且可以正常工作)