用 const
或 let
声明的变量不会挂在在 window
对象上,而是在一个称为块级作用域(block scope)的作用域内。这个作用域可以是一个函数、一个代码块(比如 {}
之间的语句),或者全局作用域。
在块级作用域中声明的变量无法通过 window
对象访问,只能在当前作用域内访问。如果要在全局作用域中访问这个变量,需要显式地将它添加到 window
对象上。
以下是一个例子:
{
const foo = 'bar';
let baz = 'qux';
var quux = 'corge';
}
console.log(window.foo); // undefined
console.log(window.baz); // undefined
console.log(window.quux); // 'corge'
在上面的例子中,foo
和 baz
声明在一个代码块内,因此它们不会挂在在 window
对象上。而 quux
声明使用了 var
,因此它会被挂在在 window
对象上。
如果我们希望在全局作用域中访问 foo
和 baz
,可以将它们手动添加到 window
对象上:
{
const foo = 'bar';
let baz = 'qux';
var quux = 'corge';
window.foo = foo;
window.baz = baz;
}
console.log(window.foo); // 'bar'
console.log(window.baz); // 'qux'
console.log(window.quux); // 'corge'
但是,在实际编程中,最好尽量避免将变量挂在在 window
对象上,以避免命名冲突和污染全局命名空间。