ES5 与ES6区别
-
在ES5中,顶层对象的属性和全局变量时等价的,var命令和function命令声明的全局变量,自然也是顶层对象.
var a = 12; function f() {}; console.log(window.a);// 12 console.log(window.f);// f(){}
-
但是ES6规定,var命令与function命令声明的全局变量,依旧是顶层对象的属性,但let命令,const命令、 class命令声明的全局变量,不属于顶层的属性。
let aa = 1; const bb = 2; console.log(window.aa);// undefined console.log(window.bb);// undefined
如何获取?
到底是怎么获取的呢?看看浏览器是怎么处理的:
const a1 = 1;
const a2 = 12;
var a3 = 123;
debugger
在图中可以看到,在全局作用域中,用let和const声明的全局变量并没有在全局对象中,只是在一个块级作用域(Script)中。
既然不属于顶层对象,获取时就不需要加window(global)
let aa = 1;
const bb = 2;
console.log(aa);// 1
console.log(bb); // 2
再看一个例子:
const a = 1;
let b = 2;
var c = 3;
{
var d = 4;
const e = 5;
{
const f = 6;
debugger
}
}
这个例子用{}创建了两个Block,分别对应e和f; 1个Script,对应变量a和b;剩下的c和d作为全局变量。