Javascript 使用全局变量有什么错?

Javascript 使用全局变量有什么错?,javascript,global-variables,Javascript,Global Variables,人们说你的代码中全局变量的数量越少,你的代码就越好。我一直在丰度中使用全局变量。我的代码可以很好地处理这一点。 那么,我的问题是,人们会从中发现什么是错误的。我确信它背后一定有一个有效的点 *如果不是全局变量,还有什么?*我还可以选择哪些选项来声明在整个代码中具有作用域的变量 这更像是一个理论问题,而不是有实际讨论的常见堆栈溢出问题,但我觉得这个问题特别重要,因为许多javascript初学者都想知道它背后的逻辑。全局变量没有那么糟糕,它取决于上下文。当您试图让事情并行工作时,它们确实会妨碍您,

人们说你的代码中全局变量的数量越少,你的代码就越好。我一直在丰度中使用全局变量。我的代码可以很好地处理这一点。 那么,我的问题是,人们会从中发现什么是错误的。我确信它背后一定有一个有效的点

*如果不是全局变量,还有什么?*我还可以选择哪些选项来声明在整个代码中具有作用域的变量


这更像是一个理论问题,而不是有实际讨论的常见堆栈溢出问题,但我觉得这个问题特别重要,因为许多javascript初学者都想知道它背后的逻辑。

全局变量没有那么糟糕,它取决于上下文。当您试图让事情并行工作时,它们确实会妨碍您,但在Javascript中,您很少这样做


当你想让事情变得更模块化、更具前瞻性时,它们可能会带来问题。通常,当您编写Javascript代码时,您编写的是一小段代码,而不是一个大系统。所以这不是问题。

只要您自己编写所有代码,并且只为自己编写,全局变量就可以正常工作


在网页中,经常会使用多个脚本。如果它们使用全局变量,它们可能会相互冲突。它们添加到全局名称空间的数量越少,与其他脚本冲突的风险就越小。

其他人已经回答了为什么不这样做,但就您关于其他选项的问题而言,您可以使用数量有限的对象,无论是使用
new
关键字创建的对象,还是简单的文本,例如:

var justOneGlobal = {
    someVariable1: 15,
    anotherVariable2: function () {alert('hello!');}
};
…这说明了干扰的可能性,因为唯一可能发生冲突的方法是其他人将其变量命名为justOneGlobal

有些人使用Java中使用的正式名称空间方法,如下所示:

var com;
if (!com) {
   com = {};
}
if (!com.mySite) {
   com.mySite = {};
}
if (!com.mySite.example) {
   com.mySite.example = {};
}
com.mySite.example.someVariable1 = 15;
…但是这种方法让人觉得很尴尬,而且与JavaScript格格不入

一种简便的方法是使用匿名函数。这会阻止任何全局变量(除非您希望从函数中导出一些全局变量):

然而,仅仅因为没有全局JavaScript变量并不意味着可以保证避免与其他插入式代码冲突

例如,如果有人覆盖内置对象的原型,例如:

Object.prototype.repeat = function (num) {
    return new Array(num+1).join(this);
};
…然后尝试使用for-in循环,实际上会遇到他们的代码:

var str = 'abc';
for (var i in str) {
    alert(i); // "repeat" now shows up here
}
您可以通过以下方式保护自己:

var str = 'abc';
for (var i in str) {
    if (str.hasOwnProperty(i)) {
        alert(i); // "repeat" now shows up here
    }
}
类似地,如果您以某种方式修改HTMLDOM,例如,将属性添加到元素上以跟踪元素的状态,那么如果另一个应用程序试图读取或写入具有相同名称的属性,则可能会出现问题。data-*属性用于存储数据,但它们不提供正式的名称空间(与XML/XHTML所承诺的名称空间属性不同),因此存在一个web应用程序使用相同属性的风险


这不仅适用于标记中可见的元素或属性,也适用于“不可见”事件,例如,如果您以旧样式附加事件而不使用
addEventListener
(或者即使您这样做了,但有人调用
preventDefault()
StopperPogation()
),您(或其他人)可能会覆盖彼此的事件。

那么var a或仅仅是a会有所不同吗???@MESSIAH:这取决于你在哪里使用它。如果在函数中使用
var
,则会创建该函数的局部变量。如果使用变量而没有特别标记它们,则始终在全局范围内创建它们。
var str = 'abc';
for (var i in str) {
    if (str.hasOwnProperty(i)) {
        alert(i); // "repeat" now shows up here
    }
}