带你认识js里var,let和const的区别

77 阅读2分钟

var

var定义变量可以修改,具有函数作用域特征不需要初始化(默认undifine),存在变量提升的现象

var a = 1;  //此处声明的变量a为全局变量`

function foo(){

var a = 2;//此处声明的变量a为函数foo的局部变量`

console.log(a);//2

}

foo();

console.log(a);//1

如果在声明变量时,省略 var 的话,该变量就会变成全局变量,如全局作用域中存在该变量,就会更新其值。如:

var a = 1;  //此处声明的变量a为全局变量`

function foo(){

a = 2;//此处的变量a也是全局变量`

console.log(a);//2

}
foo();

console.log(a);//2

let

let 声明的变量具有块级作用域的特征,let内部定义的变量,对外部没有影响,不存在变量提升现象 let 声明的变量,具有如下几个特点:

  • let 声明的变量具有块作用域的特征。
  • 在同一个块级作用域,不能重复声明变量。
  • let 声明的变量不存在变量提升,换一种说法,就是 let 声明存在暂时性死区(TDZ)
if(true){
    var message = "hi"
    console.log(message) // hi
}
console.log(message) // hi
if(true){
    let message = "hi"
    console.log(message) //hi
}
console.log(message) // 报错

const

cosnt的行为与let基本一直,最大的区别就是变量声明时必须同时初始化,而且后面尝试修改变量会出现报错。

const message = "hi"
message = "123" //报错
 
//const不允许重复声明
const message = 123
const message = 456 //报错
 
//const也是块级作用域
if(true){
    const message = "hi"
    console.log(message) //hi
}
console.log(message) //报错

这三者之间有什么区别呢

区别:1、var声明的变量属于函数作用域,let和const声明的变量属于块级作用域; 2、var存在变量提升现象,而let和const没有; 3、var变量可以重复声明,而在同一块级作用域,let变量不能重新声明,const变量不能修改