使用全局变量有什么错



人们说,代码中全局变量的数量越少,代码就越好。我一直在中使用全局变量。我的代码可以很好地处理这一点。所以我的问题是,人们在其中发现了什么错误。我相信这背后一定有一个strong有效点

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

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

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

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

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

当你想让事情变得模块化和经得起未来考验时,它们可能会带来问题。通常,当您编写Javascript代码时,您编写的是小块代码,而不是一个大系统。所以这不是问题。

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

var justOneGlobal = {
    someVariable1: 15,
    anotherVariable2: function () {alert('hello!');}
};

它吸取了干扰的可能性,因为这可能发生冲突的唯一方式是如果其他人将其变量命名为CCD_。

有些人使用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,你实际上会碰到他们的代码:

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/XTML的名称空间属性不同),因此一个web应用程序使用相同的属性存在一定的风险。

这不仅适用于在类似标记的元素或属性中可见的内容,也适用于"不可见"事件,例如,如果您在不使用addEventListener的情况下以旧样式附加事件(或者即使您这样做了,但有人调用preventDefault()stopPropagation()),您(或其他人)可以覆盖彼此的事件。

相关内容

  • 没有找到相关文章