你可能已经知道,声明一个全局变量(使用 var 或者不使用)的结果并不单单是建立一个全局变量,并且还会在 global 对象(在浏览器中为 window )中建立一个同名属性。
还有一个不太为人所知的事实是:因为浏览器演进的历史遗留问题,在建立带有 id 属性的 DOM 元素时也会建立同名的全局变量。例如:浏览器
<div id="foo"></div>
以及:dom
if (typeof foo == "undefined") { foo = 42; // 永远也不会运行 } console.log( foo ); // HTML元素
你可能认为只有 JavaScript代码才能建立全局变量,而且习惯使用 typeof 或 .. in window来检测全局变量。可是如上例所示,HTML页面中的内容也会产生全局变量,而且稍不注意就很容易让全局变量检查错误百出。
这也是尽可能不要使用全局变量的一个缘由。若是确实要用,也要确保变量名的惟一性,从而避免与其余地方的变量产生冲突,包括 HTML 和其余第三方代码。firefox
初始化时,window并无属性foo.但在第一次访问这个属性的时候(经过window.foo属性直接访问或者经过全局变量foo来访问均可以),它会被自动创建.code