2011-04-26 96 views
1

可能重复:
Why is it bad to make elements global variables in Javascript?全局变量有什么不好?

在JavaScript的圣经,据说全局变量(不带 “VAR” 关键字声明的变量)是一个非常糟糕的事情。好吧,与强类型语言(如Java或C++)相比,JavaScript就像街头流氓俚语(是!)。

但是有没有任何性能问题?或者它导致浏览器崩溃?或者在使用全局变量时有一些明显的差异?

我学习了JavaScript,并遵循书籍和专家的指导原则,但很高兴知道这是一个如此重要的主题。

回答

1

如果采用良好的结构化方法,全局变量是完全可以接受的,并且实际上可以节省一些开销/复制各种指针/变量的开销。

对我来说,使用本地变量更重要的是让代码维护,调试和移植到其他系统是多么容易。

+0

仅仅使用当地人没有任何性能收益? – Ibu 2011-04-26 07:52:40

5

全局变量可能会产生意想不到的副作用(距离作用)。

例如,当您意图使用局部变量i而忘记了var和其他一些代码(即跑前)做了同样的话开始您与变量旧值的使用。这可能会让你的代码狂飙它的轨道,并且很难追查(“价值最终在这里?”)。

就在前几天there was a question about a similar problem(在Java中,但是)并且导致太多混淆。

除此之外,它增加了变量的范围,这意味着即使您不再需要访问它,也会导致内存泄漏,它的内存不能被回收。

+1

正确。你也可以按照这个链接。它包含(不仅是“全球副作用”)很多JavaScript怪癖和处理它们的方法。 http://bonsaiden.github.com/JavaScript-Garden/#function.scopes – dmarucco 2011-04-26 07:44:23

2

我想说这里有两个主要问题:

  • 吊装
  • 重新定义外部变量的

的提升问题出来主要是想确定里面有什么你相同的变量时,可能认为是不同的范围,但实际上不是(例如,if语句的大括号内外)。

JavaScript将所有变量定义向上推,然后在最初声明和分配变量的位置分配值。这可能会导致一些奇怪的错误,你可能会在不知不觉中重新定义你自己的全局变量(可怕...)

另一个问题是,如果你在项目中使用外部库,你可以很容易覆盖一个已经定义好的变量,因此会失去一些提供的功能(你可能不想这么做),并引入一些微妙的错误(再次)。

我建议尽可能地包含局部变量,或者可以使用“命名空间”来分隔它们。

最糟糕的是,对于这两个问题,JavaScript将保持沉默,所以他们很难找到错误。