1. var
作用域:var 声明的变量有一个函数作用域,如果在函数之外声明,它将有一个全局作用域。 在全局作用域中使用 var 声明的变量将追加到 window 对象。
可变提升:var 声明的变量是提升的,这意味着无论函数的哪个部分被声明,它们都会被移动到函数的顶部。
重复声明:可以使用 var 重复声明相同的变量。
分配:使用 var 声明的变量可以重新分配。
2. let
范围:let 声明的变量具有块级作用域,该作用域仅在声明它的 ** 块内有效。
可变提升:let 声明的变量也会被提升,但它们不会被初始化。 在对声明执行之前,它们无法访问,此间隔称为“时间盲区”(tdz)。
重复声明:在同一作用域中,let 不允许重新声明已存在的变量。
分配:使用 let 声明的变量可以重新赋值,但不能重复声明。
3. const
范围:与 let 一样,const 声明的变量也具有块级作用域。
可变提升:Const 同样上升到块的顶部,但在声明声明之前,它们也无法访问,存在于“瞬态死区”中。
重复语句:cONST 不允许在同一作用域内多次声明变量。
分配:const 声明的变量不能重新赋值,必须在声明时初始化,并且值在声明后固定。 但是,如果 PERSIST 变量指向对象或数组,则可以修改对象或数组的内容。
附加到 window 对象
在浏览器环境中,在全局作用域中使用 var 声明的变量将成为 window 对象的属性。 这意味着,如果你声明 var dog='bowser',实际上,您向 Window 对象添加了一个新的全局变量 Dog,您可以通过 window 使用它狗访问它,并会得到'bowser'此值。
相反,由 let 和 const 声明的变量不会添加到窗口对象中。 这有助于避免对全局命名空间的污染,并允许对变量进行更严格的控制。