全局变量与将值传递给函数有什么区别?

7

我刚接触JavaScript,对于在函数中访问变量的最佳实践有一个简单(我认为是简单)的问题:

什么时候应该声明全局变量,而不是将值简单地传递到函数中呢?


在StackOverflow上已经有很多关于JavaScript中全局变量使用的问题。如果您使用页面右上方的搜索框,您会发现很多相关信息。 - user113716
@patrickdw:非常抱歉。就像我说的,我是JavaScript的新手,有时很难自己找到东西。我刚刚在StackOverflow上进行了另一次搜索,看看能找到什么——并没有太多适用的内容(可能是因为我是JavaScript的新手)。我很想阅读上述材料!有什么好的搜索方法吗? - Nathan Arthur
1
这个搜索 "when should I use global variables in javascript" 应该会给你提供大量的资料。你会发现,一致的答案是尽可能避免使用全局变量。任何没有在函数内声明或者没有使用 var 声明的变量都将是全局变量。 - user113716
@NathanArthur 谢谢你的提问。当我在谷歌上搜索“javascript better pass object to function or declare object global”时,我看到了你的结果并找到了我需要的答案。 - TelamonAegisthus
3个回答

6

声明全局变量只应该作为最后的选择。

全局变量一般来说都是不好的,特别是在javascript中。没有办法防止其他javascript代码覆盖你的全局变量。这种覆盖会发生在静默的情况下并导致运行时错误。

以下是一个例子:

// Your code
myParam = { prop: 42 };
function operateOnMyParam() {
  console.log(myParam.prop);
}

我在这里声明了两个全局变量:

  • myParam
  • operateOnMyParam

当你在测试 JavaScript 时,这可能会很好地运行。然而,如果一个用户将你的 JavaScript 库与我的 JavaScript 库组合起来使用,而我的 JavaScript 库恰好有以下定义,会发生什么呢?

// My code
function myParam() {
  console.log("...");
} 

这也定义了一个名为myParam的全局变量,与你的myParam冲突。谁赢得取决于导入脚本的顺序。但无论哪种方式,我们中的一个都会遇到麻烦,因为我们的一个全局对象已经失效。


你能否解释一下,或者提供其他人的解释链接,为什么会出现这种情况? - Nathan Arthur
这里的解释其实相当不错。举个(过于简单和设计不良的)例子:假设你有一些JS代码,用于客户端购物车,并将购物车存储在名为“items”的全局变量中。现在假设另一个人编写了一个脚本,操作单个永久存在的项目集合。猜猜他们称呼自己的全局变量是什么。现在,其中一个脚本将会践踏另一个脚本的“items”,导致后者出现故障。 - cHao
感谢您的详细解释和链接!(已接受) - Nathan Arthur

2

在处理无框架的JavaScript时,我会将简单的变量和函数存储在对象字面量中,以不影响全局命名空间。

var myObject = {
   variableA : "Foo",
   variableB : "Bar",
   functionA : function(){
      //do something
      //access local variables
      this.variableA
   }
}

//call functions and variables
myObject.variableA;
myObject.functionA();

2
有很多原因,但其中一个简单的原因是:函数的参数只存在于函数内部,在函数运行时才会存在。全局变量一直存在,这意味着:
  • 它会占用内存,直到您手动“销毁”它
  • 每个全局变量名都需要唯一
  • 如果在您的函数中调用另一个函数,最终再调用第一个函数,那么您可能会得到意外结果。
简而言之:由于函数参数仅在短时间内存在且不存在于函数外部,因此更容易理解发生了什么,并大大降低了出错的风险。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接