人们说代码中全局变量的数量越少,更好就是你的代码。我总是在丰富。我的代码可以正常工作。 所以我的问题是人们在其中发现了什么错误。我相信它背后必须有一个强有力的点。
* 如果不是全局变量,还有什么? *我有什么其他选择来声明在我的整个代码中具有范围的变量。
这是一个理论问题,而不是通常的stackOverflow问题,有实际的讨论,但我觉得这个问题具有特殊的重要性,因为很多javascript的初学者都想知道它背后的逻辑。
答案 0 :(得分:1)
全局变量并不坏,它取决于上下文。当你试图让事情并行工作时,它们会妨碍你,但在Javascript中你很少这样做。
当您想要使模块化和面向未来时,它们可能会出现问题。通常当你编写Javascript代码时,你会编写一小段代码而不是一个大系统。所以这不是问题。
答案 1 :(得分:1)
只要您自己编写所有代码,并且只为自己编写代码,全局变量才能正常工作。
在网页中经常使用多个脚本。如果他们使用全局变量,他们可能会相互冲突。它们添加到全局命名空间的次数越少,与其他脚本冲突的风险就越小。
答案 2 :(得分:0)
其他人已回答了为什么不这样做,但就您对其他选项的问题而言,您可以使用有限数量的对象,无论是使用new
关键字创建的对象,还是简单的文字,例如:< / p>
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来说非常尴尬和陌生。
一种方便的方法是使用匿名函数。这可以防止任何全局变量(除非您希望从函数中导出一些):
(function () {
// Put all your code in here, making sure to use "var" when defining variables
var someVariable1 = 15;
}());
// Code outside here won't know about `someVariable1`, so conflict is minimized.
仅仅因为没有全局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
}
}
类似地,如果以某种方式修改HTML DOM,例如,将元素添加到元素上作为跟踪元素状态的方法,如果另一个应用程序试图读取或写入具有相同名称的属性,则可能是问题。 data- *属性旨在用于存储数据,但它们不提供正式的命名空间(与命名空间属性不同,它将承诺XML / XHTML),因此存在一个Web应用程序使用相同属性的风险。
这不仅适用于标记元素或属性中可见的内容,还适用于“不可见”事件,例如,如果您使用旧样式附加事件而不使用addEventListener
(或者即使如果有人拨打preventDefault()
或stopPropagation()
),您(或其他人)可能会覆盖彼此的事件。