自动生成全局变量被认为是不好的做法,因为查看一些代码可能很难分辨,是故意还是忘记在某处声明变量。自动创建像 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
事实证明大多数浏览器在 window 上为文档中的每个 id 创建属性(因此是全局变量)。许多浏览器不会将它们设为只读,您可以用自己的方式覆盖它们,但 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");
})();