我注意到,在很多地方,人们都提到“只是在JS代码的顶部定义了一个变量,它就变成了全局”来回答诸如“如何从函数内部创建全局变量?”这样的问题。大多数答案都是从说不可能做到这一点开始的。当然,这样做是可能的:
<script type="text/javascript">
window.spam = 'Hello World';
</script>然后,在后面的代码中,您可以说:
<script type="text/javascript">
alert(spam);
</script>这在IE6+,火狐,Chrome,Safari等浏览器上都很好,为什么没人这么做呢?
在我的例子中,我希望人们从代码中的任何地方访问一个名为fooBar的全局变量,在我的AJAX库中,我希望这个变量在幕后自动更新,这样当他们说$.do_some_magic()时,他们就可以确保fooBar能够反映$.do_some_magic()所做的更改,而不必考虑它。我不希望他们必须在代码中创建更高的变量,我也不希望在我的库代码中创建更高的变量。我想我只是讨厌在最上面定义全局变量,而不想定义全局变量,除非有充分的理由不这样做。在那里吗?
发布于 2010-02-07 22:17:45
清晰度
这是一种显式的方式来显示您想要创建一个全局变量。
// Unclear: Intentional, or accident
function privateScope() {
spam = "hello";
function globalFunction() {
}
}这将使变量成为全局变量,仅仅是因为它是以这种方式声明的,尽管程序员并不是马上就将变量和函数设置为全局范围。
// Clear: Intentional global use
function privateScope() {
window.spam = "hello";
window.globalFunction = function () {
}
}这个例子更明显。
最佳实践
如果您事先知道一个变量将与全局作用域一起使用,则应该在文件的顶部声明它,在所有函数之外:
var spam;如果您在一个自执行匿名函数中,那么显式地使用window.spam
(function(){
// currently private to this scope
var spam;
... lots of code ...
// Expose the variable publically
window.spam = spam;
})();名称冲突
的另一面,也就是名字冲突
许多库公开一个顶级对象。您可以构造一个函数来完成这个任务,或者使用一个简单的对象文本作为命名空间:
(function(){
// Expose a single top level variable
window.YourCompany = { };
// Private:
var spam = "name";
... other code ...
// Make public
window.YourCompany.spam = spam;
})();发布于 2010-02-07 22:20:57
当然,你可以说是window.spam。但是,只有在还定义了一个名为spam的局部变量时,才需要这样做。否则,只需说spam就会自动引用全局变量。
引用未用var声明的全局变量是错误的做法,但除非您使用ECMAScript第五版“严格模式”,否则它会工作。
因为var声明是在代码之前被‘悬挂’和处理的,所以没有理由定义您的全局值“在顶部”。即使在严格的模式下,这也是完全有效的:
function setFooTo6() {
fooBar= 6;
}
var fooBar;虽然我不太愿意这么做,因为还不完全清楚。
https://stackoverflow.com/questions/2218582
复制相似问题