首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript: window.spam是一个很好的练习吗?

JavaScript: window.spam是一个很好的练习吗?
EN

Stack Overflow用户
提问于 2010-02-07 22:09:28
回答 2查看 1.3K关注 0票数 3

我注意到,在很多地方,人们都提到“只是在JS代码的顶部定义了一个变量,它就变成了全局”来回答诸如“如何从函数内部创建全局变量?”这样的问题。大多数答案都是从说不可能做到这一点开始的。当然,这样做是可能的:

代码语言:javascript
复制
<script type="text/javascript">
    window.spam = 'Hello World';
</script>

然后,在后面的代码中,您可以说:

代码语言:javascript
复制
<script type="text/javascript">
    alert(spam);
</script>

这在IE6+,火狐,Chrome,Safari等浏览器上都很好,为什么没人这么做呢?

在我的例子中,我希望人们从代码中的任何地方访问一个名为fooBar的全局变量,在我的AJAX库中,我希望这个变量在幕后自动更新,这样当他们说$.do_some_magic()时,他们就可以确保fooBar能够反映$.do_some_magic()所做的更改,而不必考虑它。我不希望他们必须在代码中创建更高的变量,我也不希望在我的库代码中创建更高的变量。我想我只是讨厌在最上面定义全局变量,而不想定义全局变量,除非有充分的理由不这样做。在那里吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-07 22:17:45

清晰度

这是一种显式的方式来显示您想要创建一个全局变量。

代码语言:javascript
复制
// Unclear: Intentional, or accident
function privateScope() {
  spam = "hello";

  function globalFunction() {

  }
}

这将使变量成为全局变量,仅仅是因为它是以这种方式声明的,尽管程序员并不是马上就将变量和函数设置为全局范围。

代码语言:javascript
复制
// Clear: Intentional global use
function privateScope() {
  window.spam = "hello";

  window.globalFunction = function () {

  }
}

这个例子更明显。

最佳实践

如果您事先知道一个变量将与全局作用域一起使用,则应该在文件的顶部声明它,在所有函数之外:

代码语言:javascript
复制
var spam;

如果您在一个自执行匿名函数中,那么显式地使用window.spam

代码语言:javascript
复制
(function(){
    // currently private to this scope
    var spam;

    ... lots of code ...

    // Expose the variable publically
    window.spam = spam;
})();

名称冲突

的另一面,也就是名字冲突

许多库公开一个顶级对象。您可以构造一个函数来完成这个任务,或者使用一个简单的对象文本作为命名空间:

代码语言:javascript
复制
(function(){
   // Expose a single top level variable
   window.YourCompany = { };

   // Private:
   var spam = "name";

   ... other code ...


   // Make public
   window.YourCompany.spam = spam;

})();
票数 7
EN

Stack Overflow用户

发布于 2010-02-07 22:20:57

当然,你可以说是window.spam。但是,只有在还定义了一个名为spam的局部变量时,才需要这样做。否则,只需说spam就会自动引用全局变量。

引用未用var声明的全局变量是错误的做法,但除非您使用ECMAScript第五版“严格模式”,否则它会工作。

因为var声明是在代码之前被‘悬挂’和处理的,所以没有理由定义您的全局值“在顶部”。即使在严格的模式下,这也是完全有效的:

代码语言:javascript
复制
function setFooTo6() {
    fooBar= 6;
}

var fooBar;

虽然我不太愿意这么做,因为还不完全清楚。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2218582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档