全局变量和window对象的关系是什么?
有一个说法:
全局变量都是window对象的属性
但是这是错误的,因为let出来之后,let定义的全局变量不属于window对象。
let carName = "BWM";
// 此处的代码不可使用 window.carName
全局变量和window对象的关系是什么?
有一个说法:
全局变量都是window对象的属性
但是这是错误的,因为let出来之后,let定义的全局变量不属于window对象。
let carName = "BWM";
// 此处的代码不可使用 window.carName
只有使用 var
定义的全局变量才能通过 window
访问:
var a = 1;
console.log(window.a); //1
(() => {
var a = 2;
console.log(window.a) // 1
})();
而 ES6 新增的 let
与 const
并不会将全局作用域下声明的变量隐式绑定至 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 之前。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
mdn里面已经描述的很清楚了
let 允许你声明一个作用域被限制在块作用域中的变量、语句或者表达式。与 var 关键字不同的是,var 声明的变量作用域是全局或者整个函数块的。 var 和 let 的另一个重要区别,let 声明的变量不会在作用域中被提升,它是在编译时才初始化(参考下面的暂时性死区)。
就像 const 一样,let 不会在全局声明时(在最顶层的作用域)创建 window 对象的属性。
你这里又涉及到一个全局变量的概念
var 的MDN
全局变量(以全局对象的属性的形式被创建)不可配置的原因是:该标识符被视为一个变量,而不是全局对象的直接属性。
所以 let 或者 const 只是全局声明,他们声明的变量并不能算全局变量。