我注意到所有人都提到“只需在JS代码的顶部定义一个变量,它就变成全局”来回答诸如“我是如何”这样的问题从函数内部创建一个全局变量?“。大多数答案首先说不可能实现这一点。当然可以这样做:
<script type="text/javascript">
window.spam = 'Hello World';
</script>
然后,在您的代码中稍后,您可以说:
<script type="text/javascript">
alert(spam);
</script>
这在IE6 +,Firefox,Chrome,Safari等中运行得非常好。那么为什么没有人这样做呢?
在我的情况下,我希望人们从代码中的任何地方和我的AJAX库中访问一个名为fooBar
的全局变量,我希望变量在后台自动更新,以便在他们说{{1}时他们可以确定$.do_some_magic()
会反映fooBar
所做的更改,而不必考虑它。我不希望他们必须在代码中创建高位变量,我也不想在库代码中创建高位变量。我想我只是讨厌在顶部定义全局变量而不愿意,除非有充分的理由不这样做。有吗?
答案 0 :(得分:7)
<强>净度强>
它是一种明确的方式,表明你打算创建一个全局变量。
// 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;
})();
名称冲突
anthares brought up另一方面,即名称冲突
许多库公开了一个顶级对象。您可以构造一个函数来执行此操作,也可以使用简单的对象文字作为命名空间:
(function(){
// Expose a single top level variable
window.YourCompany = { };
// Private:
var spam = "name";
... other code ...
// Make public
window.YourCompany.spam = spam;
})();
答案 1 :(得分:3)
当然,你可以说window.spam
。但是,如果您还定义了一个名为spam
的局部变量,那么您只需要 。否则只是说spam
会自动引用全局变量。
引用未使用var
声明的全局变量是不好的做法,但除非您使用ECMAScript第五版'严格模式',否则它将起作用。
由于var
声明在代码之前被“提升”并处理,因此没有理由必须在“顶部”定义全局变量。即使在严格模式下,这也完全有效:
function setFooTo6() {
fooBar= 6;
}
var fooBar;
虽然我不愿意这样做,因为它并不完全清楚。