全局变量和window对象的关系是什么?

全局变量和window对象的关系是什么?
有一个说法:

全局变量都是window对象的属性

但是这是错误的,因为let出来之后,let定义的全局变量不属于window对象。

let carName = "BWM";
// 此处的代码不可使用 window.carName
阅读 4.3k
3 个回答

mdn里面已经描述的很清楚了

let 允许你声明一个作用域被限制在块作用域中的变量、语句或者表达式。与 var 关键字不同的是,var 声明的变量作用域是全局或者整个函数块的。 var 和 let 的另一个重要区别,let 声明的变量不会在作用域中被提升,它是在编译时才初始化(参考下面的暂时性死区)。

就像 const 一样,let 不会在全局声明时(在最顶层的作用域)创建 window 对象的属性。

你这里又涉及到一个全局变量的概念

var 的MDN

全局变量(以全局对象的属性的形式被创建)不可配置的原因是:该标识符被视为一个变量,而不是全局对象的直接属性。

所以 let 或者 const 只是全局声明,他们声明的变量并不能算全局变量。

只有使用 var 定义的全局变量才能通过 window 访问:

var a = 1;
console.log(window.a); //1
(() => {
    var a = 2;
    console.log(window.a) // 1
})();

而 ES6 新增的 letconst 并不会将全局作用域下声明的变量隐式绑定window 上。如想达到这种效果,需要显式绑定

const a = 1;
console.log(window.a); // undefined
(() => {
    const a = 2;
    console.log(window.a); // undefined
})();
// 显式绑定
window.a = a;
console.log(window.a) // 1

所以,所谓 全局变量都是 window 对象的属性 仅限于:使用 var 在全局作用下声明的变量,或者说在 ES6 之前。

window就是一个全局变量,var声明的变量在特定情况下会挂载到window下,成为window下的属性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题