oro*_*aki 3 javascript global-variables
我注意到人们提到的" 只需在JS代码的顶部定义一个变量,它就变成了全局 ",以回应诸如" 如何从函数内部创建全局变量? "之类的问题.大多数答案首先说不可能实现这一点.当然可以这样做:
<script type="text/javascript">
window.spam = 'Hello World';
</script>
Run Code Online (Sandbox Code Playgroud)
然后,在您的代码中,您可以说:
<script type="text/javascript">
alert(spam);
</script>
Run Code Online (Sandbox Code Playgroud)
这在IE6 +,Firefox,Chrome,Safari等中运行得非常好.那么为什么没有人这样做呢?
在我来说,我希望人们访问一个名为全局变量fooBar
在他们的代码,并在我的AJAX库的任何地方,我希望变量在幕后自动更新,这样,当他们说$.do_some_magic()
,他们可以肯定的是fooBar
将反映所做的更改$.do_some_magic()
,而不不得不考虑一下.我不希望他们必须在代码中创建高位变量,我也不想在库代码中创建高位变量.我想我只是讨厌在顶部定义全局变量而不愿意,除非有充分的理由不这样做.在那儿?
明晰
它是一种明确的方式,表明您打算创建一个全局变量.
// Unclear: Intentional, or accident
function privateScope() {
spam = "hello";
function globalFunction() {
}
}
Run Code Online (Sandbox Code Playgroud)
这将使变量全局化,因为它是以这种方式声明的,尽管程序员并不是很明显地希望变量和函数具有全局范围.
// Clear: Intentional global use
function privateScope() {
window.spam = "hello";
window.globalFunction = function () {
}
}
Run Code Online (Sandbox Code Playgroud)
这个例子更加明显.
最佳实践
如果您提前知道变量将与全局范围一起使用,则应在您的所有函数之外将其声明在文件的顶部:
var spam;
Run Code Online (Sandbox Code Playgroud)
如果你在自执行匿名函数中,那么显式使用window.spam
:
(function(){
// currently private to this scope
var spam;
... lots of code ...
// Expose the variable publically
window.spam = spam;
})();
Run Code Online (Sandbox Code Playgroud)
名称冲突
anthares 提出了另一方面,即名字冲突
许多库公开了一个顶级对象.您可以构造一个函数来执行此操作,也可以使用简单的对象文字作为命名空间:
(function(){
// Expose a single top level variable
window.YourCompany = { };
// Private:
var spam = "name";
... other code ...
// Make public
window.YourCompany.spam = spam;
})();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1144 次 |
最近记录: |