什么是JavaScript中的全局变量?

问题描述:

我来自C#Class(),fields,properties,namespace ... world。我刚刚将自己发布到JavaScript。到目前为止,我一直做得很好。然而,我的一位朋友正在查看我的代码,并问我为什么要这样做。什么是JavaScript中的全局变量?

function Position (x, y) { 
    this.X = x; 
    this.Y = y; 
} 

朋友: “你刚刚过rided位置......” 我: “什么位置?” 朋友:“可能是浏览器正在使用的任何东西。” 我:“我只运行这个脚本 - 它完美的工作” 朋友:“直到它不起作用。”

好吧所以...什么?原来的位置是全球 ..但在哪里和在什么程度?我的朋友在整个浏览器中听起来像是Global。所以我的问题是;

是一个JavaScript全局,整个浏览器的全球? >只有窗户? >只有选项卡? >它走多远?

当JavaScript在浏览器中运行时,全局变量是window对象的属性。因此,仅当前窗口是全局的,而不是其他浏览器窗口,选项卡,框架或iframe。每个人都有自己的window对象。

全球内置于JavaScript中没有Position。您朋友的担心可能是您网页上包含的其他代码也可能定义了相同的全局代码。因此,其中一个定义(以后定义)将覆盖另一个定义。

+1

每个'iframe'也有它自己的'window',并且不赞成使用'frame's。 –

+0

好极了!他让我担心。 – Bixel

+0

@FabrícioMatté - 谢谢!更新。 –

位置可以从浏览器窗口的任何地方访问。用网络术语来说,我相信浏览器窗口是您可以去的最高范围。

你的朋友可能会说的是,如果某人已经定义了一个名为Position的对象存在于全局作用域中,那么你的代码只是改变了这种行为。通常,您将希望通过命名空间保护全局范围与任何自定义方法。

这是当前窗口的全局。不要担心其他标签,窗口或iframe。话虽这么说,我想他正试图状态是什么在JavaScript即

不要弄乱全局命名空间

也就是说,不管你做全球性应该不会太大,它一个很好的原则应该是非常有意的。

JavaScript有函数作用域(不是块作用域),所以一个简单的方法来解决这个问题是把所有东西都包装在一个立即调用的函数表达式中。

;(function() { 

    function Position (x, y){ 
      this.X = x; 
      this.Y = y; 
    } 

    // use Position here 

}()); 
+2

+1的对话中如何说话,我感到困惑,我会在这些行中发表一个答案(但懒惰':P')。另外,由于OP从JS开始,下面是一些帮助的参考链接:[Immediately-Invoked Function Expression(IIFE)](http://benalman.com/news/2010/11/immediately-invoked-function-expression /),[JavaScript模式模式:深入](http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html) –

+0

hrmm有趣..只是潜入jRequire - 并学习如何使“模块”。 Position()被用来为可绘制对象创建许多位置,如果我需要调整位置,我可以在一个易于阅读的区域中声明它们,我可以在那里调整它,而不必在其他地方寻找它。 – Bixel