在封闭环境中运行功能

时间:2011-06-24 17:41:12

标签: javascript

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

例如,我想要:

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

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

alert(x) //does not return 5

我正在尝试编写代码测试程序。我一直在阅读有关范围和课程的内容,但我对它的了解不足以解决这个问题。

2 个答案:

答案 0 :(得分:4)

简短的回答是,您无法阻止一段JavaScript代码访问全局变量。这就是为什么它们被称为'全局'并且是JS程序员坚持使用适当范围变量的众多原因之一。

答案略长,

您的示例令人困惑,因为在您的代码评论中,当我认为您的意思是“我不希望这样做,但确实如此”时,您说“不起作用”。

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

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

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

我不确定你想要构建什么样的测试套件但是我相当肯定你必须通过不允许在待测试代码中进行任意全局分配来强制执行一点QA,这些天来,它不仅仅是一种最佳实践。

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

答案 1 :(得分:1)

window中定义的变量是全局变量。如果您不希望它们可访问,请不要全局定义它们。