let与var与const,变量提升,函数提升,暂时性死区(TDZ)
1、var变量默认提升:
console.log(i);
var i = 1;
输出undefined,并不是变量不存在。
2、函数默认提升:
test();
function test(){
console.log(1);
}
输出1。
3、es6之前 JavaScript默认是函数作用域、全局作用域,es6引进了let和const可以使用块级作用域。
4、let与var的区别:
let没有变量提升。
let实现了块级作用域。
5、let和const的区别:const 声明时必须进行初始化,且初始化后值不可再修改,其他特性与let一样。
6、暂时性死区(TDZ):
var i = 1;
function(){
i = 2;
let i;
}
浏览器直接报错。
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
面试题:
<script>
for(var i = 0 ;i < 10;i++){
setTimeout(function(){
console.log(i);
},0);
}
</script>
setimout 执行的时候 for 已经执行完毕,所以打印出来 10 个 9 应该改用let。