Javascript 为什么不将全局let变量添加到浏览器的窗口对象?

Javascript 为什么不将全局let变量添加到浏览器的窗口对象?,javascript,dom,Javascript,Dom,考虑下面我在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=…,那么这就行了。为什么

考虑下面我在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=…
,那么这就行了。为什么?

这是通过:

let允许您声明限制在块语句或其使用的表达式范围内的变量,这与var关键字不同,var关键字全局定义变量,或局部定义整个函数,而不考虑块范围。var和let之间的另一个区别是,后者只有在解析器对其求值时才初始化为值(见下文)

与const一样,let不会创建窗口的属性 全局声明时(在最顶部的作用域中)的对象


因为这就是
let
的定义。来自MDN: