var和let都是用于定义变量,区别如下
变量提升
var存在变量提升(变量自动提前声明),而let不存在变量提升
console.log(age) //undefined
var age=18
这是因为var 存在变量提升,等价写法如下
var age
console.log(age) //undefined
age=18
而let不存在变量提升
console.log(age) //报错
let age=18
报错结果如下

块级作用域
var 不存在块级作用域,而let存在块级作用域
if(1===1){
var name="zs"
}
console.log(name); //zs
if(1===1){
let name="zs"
}
console.log(name);
//不在同一块级作用域,不能访问到name的值
现在有这样一个需求:数组的每一项都是同一个函数,而函数的返回值由数组的下标决定
const arr=[]
for(var i=0;i<10;i++){
arr[i]=function(){
return i
}
console.log(arr[i]);
}
打印结果如下

进行函数调用时,发现结果跟我们想的不一样
console.log(arr[5]()); //结果为:10
这是为什么呢?这是因为var 不存在块级作用域,当for循环执行完毕后,i的值变为了10,而进行函数调用时的i不再是数组的下标,而都是10。
解决方法就是将var 改变成let
const arr=[]
for(let i=0;i<10;i++){
arr[i]=function(){
return i
}
console.log(arr[i]);
}
console.log(arr[5]()); //结果为5
这是因为for循环时,每一个i都有自己的块级作用域,不会进行污染。
作用:不会污染全局变量
let RegExp = 20
console.log(RegExp);
console.log(window.RegExp);

重复声明
var 可以重复声明变量,而let不能重复声明变量
重复声明会覆盖之前的变量,容易带来问题
总结
现在定义变量,应该避免使用var,而是应该使用let