Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 新函数和eval之间的奇怪交互_Javascript_Firefox - Fatal编程技术网

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中对其进行了测试,并且可以正常工作)