为什么全局 let 变量不会添加到浏览器的 window 对象中?

14 浏览
0 Comments

为什么全局 let 变量不会添加到浏览器的 window 对象中?

考虑下面的代码,我在我的Chrome浏览器控制台中运行:

var x = "hello";
let foo =  function(){
  console.log("hi");
};
console.log(x); // hello
console.log(foo()); //hi
console.log(window.x); // hello
console.log(window.foo()); // Error

如果我使用var foo = ...而不是let foo = ...,那么它就能正常工作。为什么?

使用var关键字声明的变量会被提升到函数作用域的顶部,这意味着它们在函数内的任何地方都可以访问到。而使用let关键字声明的变量则不会被提升,它们只能在声明后才能被访问。

在上述代码中,当使用let foo = ...声明变量foo时,它只能在声明后才能访问。所以当尝试在console.log(foo())中调用foo时,会出现错误。

相反,如果使用var foo = ...来声明变量foo,那么它会被提升到函数作用域的顶部,所以在console.log(foo())中调用foo不会出错。

0
0 Comments

为什么全局let变量没有添加到浏览器的window对象中?

这是由设计决定的:let关键字允许你声明仅在块级语句或表达式中有效的变量,而不像var关键字那样在整个函数范围内定义变量。var关键字定义的变量是全局的,或者是在整个函数范围内的局部变量,不受块级作用域的限制。var和let之间的另一个区别是,后者只有在解析器对其进行评估时才被初始化(见下文)。

与const一样,全局声明的let变量在顶层作用域中时,不会创建window对象的属性。

解决方法是使用var关键字来声明全局变量,这样它们将成为window对象的属性。例如:

var globalVariable = 'This is a global variable';
console.log(window.globalVariable); // 'This is a global variable'

然而,建议尽量避免使用全局变量,因为它们会导致命名冲突和代码维护困难。使用块级作用域和模块化的方式来管理变量,可以提高代码的可读性和可维护性。

0