Javascript 为什么全局let声明被非作用域变量覆盖?

Javascript 为什么全局let声明被非作用域变量覆盖?,javascript,global-variables,var,let,Javascript,Global Variables,Var,Let,当我们在不指定的情况下创建变量时,let或var会被添加到浏览器中的窗口对象中。比如说 函数更改(){ val=20; } 改变(); console.log(window.val)//20 控制台日志(val)//20MDN这样说: 用var声明的变量的作用域是其当前执行上下文,该上下文是封闭函数,或者对于在任何函数之外声明的变量,是全局的。如果重新声明JavaScript变量,它不会丢失其值 MDN是这样说的: 声明的变量让在其定义的块以及包含的任何子块中具有其作用域。通过这种方式,let

当我们在不指定
的情况下创建变量时,let
var
会被添加到浏览器中的窗口对象中。比如说

函数更改(){
val=20;
}
改变();
console.log(window.val)//20
控制台日志(val)//20
MDN这样说:

var
声明的变量的作用域是其当前执行上下文,该上下文是封闭函数,或者对于在任何函数之外声明的变量,是全局的。如果重新声明JavaScript变量,它不会丢失其值

MDN是这样说的:

声明的变量让
在其定义的块以及包含的任何子块中具有其作用域。通过这种方式,
let
的工作原理非常类似于
var
。主要区别在于
var
变量的范围是整个封闭函数:

它们都在一个作用域中结束,然后传播到子作用域,但它们最终在哪个作用域中结束,以及它们如何确定该作用域是不同的


请注意,
元素的整体确实有一个隐式块,该隐式块继承了
窗口
作为祖先范围。由
var
声明的变量最终被限定在
window
中,而由
let
声明的变量则被限定在这个隐式块中。

通过在脚本的顶层使用let声明变量,您可以在整个脚本内部甚至外部访问它。在函数内部,您没有为非作用域变量赋值

即使您按照下面的方式编写函数,它也不会分配给窗口对象,因为它将是函数作用域

function change(){
var value = 20;
}