根据预编译原理(已知),我们知道在执行script函数前会产生一个全局对象‘GO(Global Object)’也就是熟悉的window对象!
点击预编译了解关于预编译
在这个window对象里包括了
全部的全局变量,
在这之中其中不要忘了隐式全局变量(即未声明即使用的变量)
这句话就可以理解成:一切的全局变量都属于window对象里的属性(属性名&属性值)
下面这个例子可以帮助解释一下
<script>
var a = 1;
function test() {
b = 1;
}
</script>
即在这个<script>起始标签前,浏览器会自动第一次预编译,
生成
GO{
a : undefined,
b : undefined, //隐式全局变量
test : function test(){ b = 1;}
}
下面开始进入正题:
<script>
var a = 1;
function test() {
b = 1;
}
//console.log(b) 第一种
//console.log(wondow.b) 第二种
</script>
如果以第一种去输出,则会报错,
第二种去输出,则会输出undefined,
注意:此时我没有运行函数,即没有对b赋值!! (也没有产生AO对象)
注意:此时我没有运行函数,即没有对b赋值!! (也没有产生AO对象)
注意:此时我没有运行函数,即没有对b赋值!! (也没有产生AO对象)
例子二:
<script> var a; console.log(b); b = 1; </script>
同上,这样也是会报错的。
总结:
window.b 和 b 的不同就是,第一个可以调用隐式全局变量,第二个则不可以;
但是,
有没有发现所有的输出,都是在未声明即赋值之前进行的,
如果赋值了,会出现什么样的结果呢?
例子一:
<script> var a = 1; function test() { b = 1; } test(); //console.log(b) 第一种 //console.log(wondow.b) 第二种 </script>
产生的结果是一样的,都是1;
例子二呢?:
<script> b = 1; console.log(b); console.log(window.b); </script>
同样,结果是一样的,
那么我们可以就知道,
如果隐式全局变量进行了赋值之后,那么window. 和 b 二者的差别则不存在!