bg
for循环中, var 会打印出 5 个 5。let 会分别打印出 0、1、2、3、4
理解:有一个隐藏的作用域,在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次。
for( let i=0; i<liList.length; i++){
let i = 隐藏作用域中的i //近似理解
liList[i].onclick = function(){
console.log(i)
}
}
关于 let
- let 声明的变量的作用域是块级的;
- let 不能重复声明已存在的变量;
- let 有暂时死区,不会被提升。
【 暂时死区,就是不能在初始化之前,使用变量。】
提升本质 (var/let hoisting)
1️⃣ 要搞清楚提升的本质,需要理解 JS 变量的「创建create、初始化initialize 和赋值assign」过程:
- let 的「创建」过程被提升了,但是初始化没有提升。
所以:在 let x 之前使用 x 会报错 - var 的「创建」和「初始化」都被提升了。
var 在代码执行之前就「创建变量,并将其初始化为 undefined」 - function 的「创建」「初始化」和「赋值」都被提升了。
function 在代码执行之前就「创建、初始化并赋值」
2️⃣ 由于 function 比 var 多一个「赋值」过程,所以同时存在时,不论顺序,输出都是函数。
结论:function 比 var 优先。
关于 const
const 和 let 只有一个区别,那就是 const 只有「创建」和「初始化」,没有「赋值」过程。
(赋值报错)
学习参考:https://zhuanlan.zhihu.com/p/28140450