let、const和var三者都是申明一个变量的,let和const是ES6新增的。在一个作用域中,用var申明的变量会被提升到该作用域的最前面,但是let和const不会。
var 展示:
function test(){
if(true){
var a = 1;
}
console.log(a); // 打印出1。在if的作用域中申明的a被提升出来了
}
test();
最有名的面试题:for循环中定时器的闭包
for(var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i) //5, 5, 5, 5, 5
}, 0)
}
console.log(i) //5 i跳出循环体污染外部函数
let展示:
function test(){
if(true){
var a = 1;
}
console.log(a); // 报错: a is not defined
}
test();
在var使用的for循环中定时器的闭包面试题,用let的时候,外层的i也会报错
const和let一样,都是在当前申明的块中有效,不能像var一样提升作用域;
但是const是不能修改的,let可以被反复修改;
网友评论