试着读取一下
var a = 'a';
let b = 'b';
console.log(window.a); //a
console.log(window.b); //undefind
同样是在全局声明的变量,为什么let声明的无法在window中找到?
先别急,再打个断点调试一下看看
从这个图可以看到,a现在确实已经在window上了,b却在 [[scope]] 中的第一个script中,这是什么?
GlobalEnv 是一个复合环境,由 global(顶层对象)和 declsEnv(一般声明环境)组合而成。
在ES5中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象。
但ES6规定,var 命令和 function 命令声明的全局变量,依旧是顶层对象的属性,但 let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。而是在一般声明环境 declsEnv 中。通过 var 声明的变量在 Global 作用域中。