a = 10; 这仅仅是给全局对象创建了一个新属性(但它不是变量)。“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”(它之所以能成为全局对象的属性,完全是因为javascript中存在一个global对象,这样的操作不是声明一个变量而是给global对象增加一个a属性。
下面看一个简单的例题来说明问题 复制代码 代码如下: if (!("a" in window)) { var a = 1; } alert(a);
首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1;
你可以用如下方式来检测全局变量是否声明
"变量名称" in window
第二,所有的变量声明都在范围作用域的顶部,看一下相似的例子:
复制代码 代码如下: alert("a" in window); var a;
此时,尽管声明是在alert之后,alert弹出的依然是true,这是因为JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部,最终的代码效果是这样的: 复制代码 代码如下: var a; alert("a" in window);