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

时间:2010-02-07 22:09:28

标签: javascript global-variables

我注意到所有人都提到“只需在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所做的更改,而不必考虑它。我不希望他们必须在代码中创建高位变量,我也不想在库代码中创建高位变量。我想我只是讨厌在顶部定义全局变量而不愿意,除非有充分的理由不这样做。有吗?

2 个答案:

答案 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;

虽然我不愿意这样做,因为它并不完全清楚。