全局对象是指最顶层的对象,在浏览器环境下是指window对象。在ES5中,全局对象的属性和全局变量是等价的。
例如
输出结果:
1
2
a是全局对象window的属性,b是全局对象,所以对全局对象属性的赋值和全局对象的赋值,实际就是一回事。
从上述代码可以看出,未声明的全局变量,会自动认为全局变量window的属性,这是被人们认为是javaScript设计的败笔之一。这样的设计带来了两个很大的问题,首先是没法在编译时就报出变量未声明的错误,只有运行时才能知道,其次程序员很容易不知不觉地就创建了全局变量(比如打字出错)。另一方面,从语义上讲,语言的顶层对象是一个有实体含义的对象,也是不合适的。
那么在ES6语法中,改变了这一弊端。ES6规定为了保持浏览器的兼容性,使用var,function声明全局变量,仍然是全局对象的属性。另一方面规定let,const,class命令声明的全局,不属于对象属性。
运行结果:
1
undefined