面试题030-let声明的变量去哪儿了?

126 阅读1分钟

试着读取一下

var a = 'a';
let b = 'b';

console.log(window.a); //a
console.log(window.b); //undefind

同样是在全局声明的变量,为什么let声明的无法在window中找到?

先别急,再打个断点调试一下看看

微信图片_20220502170837.png 从这个图可以看到,a现在确实已经在window上了,b却在 [[scope]] 中的第一个script中,这是什么?

GlobalEnv 是一个复合环境,由 global(顶层对象)和 declsEnv(一般声明环境)组合而成。

在ES5中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象。 但ES6规定,var 命令和 function 命令声明的全局变量,依旧是顶层对象的属性,但 let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。而是在一般声明环境 declsEnv 中。通过 var 声明的变量在 Global 作用域中。