使全局变量自动被认为是不好的做法,因为它可以是很难说,看在某些代码中,无论是故意还是忘记在某处声明变量。自动创建像doesn’t work in ES5 strict mode这样的全局变量,并可能在未来版本的ECMAScript中逐步淘汰。
在浏览器的JavaScript 的全球范围实际上是window
。当你参考document
时,你会得到window.document
。在浏览器中创建全局变量的最佳做法是将其添加到window
(Node.js中的global
)。这里的an example from jQuery:
window.jQuery = window.$ = jQuery;
上window
一些特性(因此一些全局变量)是只读的,你不能覆盖他们。 window.document
是一个(在Chrome中进行测试,这是所有浏览器特定的和可以改变):
window.document; // → Document
window.document = 'foo'; // → "foo" // It worked!
window.document; // → Document // Hmm, no it didn’t
事实证明,大多数浏览器创建的文档中的每个ID上window
(因此全局变量)属性。许多浏览器不会让它们成为只读文件,您可以用自己的文件覆盖它们,但Internet Explorer会覆盖它们。
这是JavaScript中的全局变量可能很危险的另一个原因 - 您的一个ID可以匹配只读的window
属性(今天或某些未来的浏览器)。
在顶层(不在函数内部),var
声明全局变量。在顶层陈述var document = 'foo'
不会抛出错误,但document
仍然是Document
,而不是"foo"
。
顺便说一句,新的上下的浏览器(支持ES5),让您与Object.defineProperty
创建自己的只读全局:
Object.defineProperty(window, 'foo', { value: 'bar', writable: false });
foo = 'baz';
foo; // → "bar"
我有三个选项供你。
继续使用你的元素全局变量,但让他们独立,如果他们已经存在(上window
创建它们明确地这样的代码是清晰和冷静与ES5):
if (! window.randomDiv) {
window.randomDiv = document.getElementById('randomDiv');
}
创建一个对象,在window
上,用作应用程序自己的名称空间,不会干扰其他库或浏览器。这是常见的,并认为相当不错的做法,尤其是如果它需要跨JavaScript文件被访问:
// Early in your code…
window.Fantabulum = {};
// Later on…
Fantabulum.randomDiv = document.getElementById("randomDiv");
避免让全局。请确保您的应用程序的代码是一个函数内(应该已经让你的其他变量不是全局性的,不具有相同的限制!),并为您的元素声明变量:
(function(){
var randomDiv = document.getElementById("randomDiv");
})();
来源
2011-07-28 01:42:17
s4y
它在IE中工作,如果你'var randomDiv = document.getElementById(“randomDiv);'? –
我不明白为什么这不起作用 –