在封闭环境中运行功能

mat*_*ven 0 javascript

如何运行代码,以便代码本身无法访问该window变量上的主代码?

例如,我想要:

var popup = function(msg){ alert(msg); };

(function(){
    window.x = 5;
    popup("hi."); //does not work
})();

alert(x) //does not return 5
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写代码测试器。我一直在阅读有关范围和类的信息,但我对它们的理解还不够,无法弄清楚这一点。

Mic*_*man 5

简短的答案是,您不能阻止一段JavaScript代码访问全局变量。这就是为什么它们被称为“全局”的原因,也是JS程序员坚持使用适当范围的变量的众多原因之一。

稍长一点的答案,

您的示例令人困惑,因为在我的代码注释中您说“不起作用”,而我认为您的意思是“我不希望它起作用,但它确实起作用”。

在JavaScript中,闭包在声明它们的范围内“关闭”。

JS运行时首先在当前作用域内查找变量引用,如果找不到该引用,它将在父作用域,父作用域的父作用域等中查找变量引用,直到存在没有祖先的作用域。最后,它将在全局范围(在浏览器中对应于窗口范围)中查找引用。这就是为什么可以从任何地方访问window作用域中的变量的原因。

JavaScript中还有一个额外的怪癖,当引用变量但尚未声明变量(通过var关键字)时,该变量将在Global范围内自动创建。如果不是这种情况,JS将是一种更好的语言,但这是另一回事。

我不确定要构建哪种测试套件,但我可以肯定地说,您必须通过不允许在待测试代码中进行任意全局分配来执行一点质量检查。这些天不只是一种最佳实践。

我在上一个项目中使用的一种方法是在运行要测试的代码之前枚举Global范围内的属性,并在加载代码后和每次执行之后将此列表与列表匹配。如果出现新的全局变量,则自动测试失败。