【问题标题】:What is wrong in using global variables? [duplicate]使用全局变量有什么问题? [复制]
【发布时间】:2013-06-19 23:56:51
【问题描述】:

人们说你的代码中全局变量的数量越少,你的代码就越更好。我一直在大量使用全局变量>。我的代码可以正常工作。 所以我的问题是人们发现它有什么问题。我相信它背后一定有一个强大的有效点

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

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

【问题讨论】:

标签: javascript global-variables


【解决方案1】:

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

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

【讨论】:

  • 和 var a 或只是 a 有什么不同吗??
  • @MESSIAH:这取决于你在哪里使用它。如果您在函数内使用var,它会创建一个对该函数本地的变量。如果您使用变量而不专门标记它们,它们总是在全局范围内创建。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    其他人已经回答了为什么不,但就您对其他选项的问题而言,您可以使用有限数量的对象,无论是使用 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()),你(或其他人)可以覆盖彼此的事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2019-05-04
      • 1970-01-01
      相关资源
      最近更新 更多