实际上 eval 在定义它的范围内创建变量或修改变量,无论您是否使用 val。或者换句话说,默认情况下它没有自己的范围。
所以当你这样做时
eval("var outer = 0;");
console.log(outer); //0
您在外部范围内创建变量。令人惊讶的是,这在 chrome 中也以相同的方式工作 - 是否使用 window.onload 并不重要。
要使 eval 具有自己的范围,您必须执行以下操作:
eval("'use strict'; var outer = 0;");
console.log(outer); //Uncaught ReferenceError: outer is not defined
现在有一个单独的 eval 范围。在 eval 中使用“use strict”,您的代码将在 chrome 中工作,并且不允许覆盖 eval 之外的变量。
eval("'use strict'; var outer = 0; function test() {'use strict'; outer = 1; } test(); alert('ok');");
所以这部分回答了如何避免错误。
第二部分我很感兴趣,但自己找不到答案。
问题如下,为什么你的代码在 chrome 中抛出错误,而这在 chrome 中有效(这意味着创建了全局变量):
window.onload = function() {
eval("var outer = 0; function test(){console.log(outer); } test();");
}
以及为什么它只发生在window.onload
.