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变量不能修改