JavaScript:window.spam是一个很好的做法吗?

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(),而不不得不考虑一下.我不希望他们必须在代码中创建高位变量,我也不想在库代码中创建高位变量.我想我只是讨厌在顶部定义全局变量而不愿意,除非有充分的理由不这样做.在那儿?

Dou*_*ner 7

明晰

它是一种明确的方式,表明您打算创建一个全局变量.

// 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)