# ❓ 全局作用域中,用 const 和 let 声明的变量不在 window 上,那到底在哪里?如何去获取?。

顶层对象,在浏览器环境指的是 window 对象,在 Node 指的是 global 对象。 在 ES5 中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象。

var jeff = 'jeff'
function fn() {}

console.log(window.jeff) // jeff
console.log(window.fn) // fn(){}
1
2
3
4
5
window.age = 18
age // 18

age = 20
window.age // 20
1
2
3
4
5

上面代码中,顶层对象的属性赋值与全局变量的赋值,是同一件事。

但 ES6 规定,var 命令和 function 命令声明的全局变量,依旧是顶层对象的属性,但 let 命令、const 命令、class 命令声明的全局变量,不属于顶层对象的属性。

let jeff = 'jeff'
const age = 18

console.log(window.jeff) // undefined
console.log(window.age) // undefined
1
2
3
4
5

上面代码中,全局变量 jeff agelet const 命令声明,所以它不是顶层对象的属性,返回 undefined。

那么究竟 let const 声明的变量究竟存在那里,让我们用 chrome 控制台 debugger 看一下

img

通过上图也可以看到,在全局作用域中,用 letconst 声明的全局变量并没有在全局对象中(确实在下面图截不下),只是一个块级作用域(Script)中

那么如何访问呢?

let jeff = 'jeff'
const age = 18

// 在定义变量的块级作用域中就能获取啊,既然不属于顶层对象,那就不加 window(global)。

console.log(jeff) // jeff
console.log(age) // 18
1
2
3
4
5
6
7