在介绍let var const之前,我们先对以下几个点,进行了解
变量提升,又名预解释,预解析,意思是在浏览器拿到js代码将要执行之前,会整体的解读一遍,把所有var声明的变量和function声明的函数提前定义
变量提升
变量在声明之前进行了使用,并且不会报错,得到的值为undefined
暂时性死区
在使用let const声明的变量之前,都不能使用这个变量,否则就会报错,在这之前的代码块,对于这个声明的变量来说,叫做暂时性死区
let var const的区别主要体现在这几个方面
1.是否存在变量提升
用var声明的变量存在变量提升;let const不存在变量提升
2.是否存在暂时性死区
用let,const声明的变量之前,都不能使用这个变量,否则就会报错,在这之前的代码块,对于这个声明的变量来说,叫做暂时性死区 var 不存在暂时性死区
3.是否允许重复声明变量
var可以重复声明变量,let const 不可以
4.是否存在块级作用域
作用域分为 全局作用域 局部(函数)作用域 块级作用域
let const 存在块级作用域,var不存在
//例子
let a=1
if(a==1){
let a=2
}
console.log(a) //a为1
5.是否能修改声明的变量
let var声明的变量可以进行重复修改 const 的值是常量,一旦赋值,就不能进行修改使用const声明一个引用数据类型,此时的值是一个内存地址;只要不去修改内存中的地址,里面的内容是可以被重复进行修改的 //const声明的变量,必须要进行初始化,否则会报错eg:const a=1 不能为const a;
举例说明块级作用域
// 块级作用域,以及let var声明同一个变量,不同的体现
//
//1.使用var进行循环
var arr=[]
for(var i=0;i<2;i++){
arr[i]=function(){
console.log(i)
}
}
arr[0]() //2
arr[1]() //2
//2.使用let进行循环
//let形成一块独立的作用域,会独立向上查找
let arr=[]
for(let i=0;i<2;i++){
arr[i]=function(){
console.log(i)
}
}
arr[0]() //0
arr[1]() //1
//
//
//3.使用var声明i,实现let声明的结果,需要使用到闭包
//函数自调用的方法进行实现
var arrss = []
for (var i = 0; i < 2; i++) {
arrss[i] = (function(i) {
return function() {
console.log(i)
}
})(i) //将每次遍历的i作为实参,传递给自调用的函数,通过函数返回值,将打印的结果进行返回
}
arrss[0]()//2
arrss[1]()//2
以上只是个人了解,如有需要改正的地方,还希望小伙伴们的指点哟!