其他人已经回答了为什么不,但就您对其他选项的问题而言,您可以使用有限数量的对象,无论是使用 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 格格不入。
一种方便的方法是使用匿名函数。这完全可以防止任何全局变量(除非您希望从函数中导出一些):
(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()),你(或其他人)可以覆盖彼此的事件。