浅聊一下let const var
前言:let, const,var是很常见的,但是总是对它有一点模模糊糊的,像在我面前隔了一层面纱,所以看了许多篇文章,小小的总结了一下,希望我自己能搞懂它,也希望对各位有所帮助。(文中的例子都是经过vscode验证过的)
1. var
- 由它声明的变量是全局变量或者顶层变量
- 可以重复声明和赋值
- 在函数内部,由var声明的变量是局部的,但是若是直接给变量赋值,那就是全局变量
function foo(){
var a = 1 //这是一个局部变量,不能通过全局对象访问
b = 2 //这是一个全局变量,通过全局对象可以访问到
}
- var存在声明提升
console.log(a) //不会报错,结果是undefined
var a = 2
2. let
- 声明的变量只在let所在的块作用域中有效
console.log(a) //报错;ReferenceError: a is not defined
{
let a = 1
}
console.log(a)//报错;ReferenceError: a is not defined
:: 如果是var的话,var声明的就是全局变量
console.log(a); //因为有变量提升: undefied
{var a = 1}
console.log(a); // 1
- 有暂时性死区
console.log(a) //直接报错;ReferenceError: Cannot access 'a' before initialization
let a = 1
- 在同一作用域内不能重复声明,能重复赋值
3. const
- 声明的变量只在const所在的块作用域中有效
- 是只读的常量
如果是定义的引用数据类型,比如数组,数组中的值是可以改变的,因为const 固定的是它的引用地址 - 存在暂时性死区:未声明之前不可以使用
- 一旦声明必须要进行初始化
4. 遇到过的一个面试题: var不管在哪里声明的变量都会挂载在 全局对象上吗?
(我当时说var声明的变量是全局变量,可以通过全局对象来访问)
不是。在一个函数内,var声明的变量只在这个函数作用域中可以访问到,外层作用域,还有window都是访问不到的。
也就是说,在函数中用var声明的变量是局部的。