2

我来自 C# Class()、字段、属性、命名空间...世界。我刚刚开始使用javascript。到目前为止,我一直做得很好。然而,我的一位朋友正在查看我的代码并问我为什么这样做。

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

朋友:“你刚刚超越了位置……” 我:“什么位置?” 朋友:“可能是浏览器正在使用的任何东西。” 我:“我只运行这个脚本——它运行良好”朋友:“直到它不起作用。”

好吧……什么?原来位置是全球性的..但在哪里以及在什么程度上?我的朋友让它听起来像是整个浏览器的全局。所以我的问题是;

javascript 是全局的,对整个浏览器来说是全局的吗?> 只有窗户?> 只有标签??> 能走多远??

4

3 回答 3

4

它对当前窗口是全局的。不要担心其他选项卡、窗口或 iframe。话虽这么说,我认为他试图说明的是 JavaScript 中的一个很好的原则,即

不要弄乱全局命名空间

这意味着无论你做什么全球都不应该太多,它应该是非常有意的。

JavaScript 具有函数作用域(不是块作用域),因此解决此问题的一种简单方法是将所有内容包装在立即调用的函数表达式中。

;(function () {

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

     // use Position here

}());
于 2013-04-18T21:27:37.613 回答
2

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

JavaScript中没有Position内置全局变量。您朋友的担心可能是您在页面中包含的其他一些代码也可能定义相同的全局代码。因此,其中一个定义(以稍后定义的为准)将覆盖另一个。

于 2013-04-18T21:24:53.990 回答
0

可以从浏览器窗口中的任何位置访问位置。在网络方面,我相信浏览器窗口是你可以去的最高范围。

您的朋友可能会说,如果有人已经定义了一个存在于全局范围内的名为 Position 的对象,那么您的代码只是更改了该行为。通常,您会希望通过命名空间来保护全局范围免受任何自定义方法的影响。

于 2013-04-18T21:25:32.683 回答