为什么在Javascript中创建元素全局变量是不好的?

时间:2009-04-27 18:09:04

标签: javascript internet-explorer variables events global

我听说在JavaScript中创建全局元素并不是一个好主意。我不明白为什么。这是IE无法处理的事情吗?

例如:

    div = getElementById('topbar');

4 个答案:

答案 0 :(得分:7)

我认为这不是一个实施问题,而是一个好的与坏的做法问题。通常全局*是不好的做法,应该避免(全局变量等),因为你从来不知道项目的范围将如何演变以及如何包含文件。

我不是一个很大的JS狂热者,所以我无法向你详细说明为什么JS事件不好但是Christian Heilmann talks about JS best practices here,你可以看看。还可以尝试谷歌搜索“JS最佳实践”

编辑:关于全局变量的维基百科,也可能适用于您的问题:

  

[全局变量]通常是   被认为是不好的做法   因为他们的非局域性:全球化   变量可能会被修改   从任何地方,(除非他们居住在   受保护的记忆)和任何部分   程序可能取决于它。全球化   变量因此具有无限制   创造共同的潜力   依赖,并添加相互   依赖性增加了复杂性。看到   远距离行动。但是,在一个   少数情况下,全局变量都可以   适合使用。例如,他们   可以用来避免不得不通过   经常使用的变量   在几个职能中。

通过http://en.wikipedia.org/wiki/Global_variable

答案 1 :(得分:4)

  

这是IE无法处理的事情吗?

没有它不是IE的东西。您永远不能假设您的代码将是文档中使用的唯一脚本。因此,确保您的代码没有其他脚本可以覆盖的全局函数或变量名称非常重要。

有关示例,请参阅Play Well With Others

答案 2 :(得分:2)

我认为“事件”是指事件处理JavaScript(函数)。

一般来说,在JS中使用多个全局变量是不好的。 (如果您存储任何数据以备将来使用,则不可能至少使用一个。)这是因为它遇到了与所有namespacing试图解决的问题相同的问题 - 如果您编写了一个方法doSomething(),那该怎么办?别人写了一个名为doS​​omething()的方法?

解决此问题的最佳方法是创建一个全局变量,该变量是保存所有数据和函数的对象。例如:

var MyStuff = {};
MyStuff.counter = 0;
MyStuff.eventHandler = function() { ... };
MyStuff.doSomething = function() { ... };

// Later, when you want to call doSomething()...
MyStuff.doSomething();

这样,您最小化污染全局命名空间;你只需要担心其他人使用你的全局变量。

当然,如果您的代码永远不会与其他任何人一起玩,那么这一切都不是问题......但是如果您最终使用其他人的代码,这种想法会让您陷入困境。只要每个人在JS全局名称方面都表现得很好,所有代码都可以相处。

答案 3 :(得分:1)

在代码中使用全局变量应该没有任何问题,只要将它们包装在uniqe namespase / object中(以避免与不属于你的脚本冲突)

在javascript中使用全局变量的主要优势来自javascript不是强类型语言的事实。因为,如果你将一些复杂的对象作为参数传递给函数,你将会失去对这些对象的所有智能(在函数范围内)。 而使用全局对象代替,将保留这种智能。

我个人觉得非常有用,而且肯定会出现在我的代码中。

(当然,人们应该在locales和globals变量之间取得适当的平衡)