第 1 题
两个循环分别打印什么?
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i));
for (let j = 0; j < 3; j++) setTimeout(() => console.log(j));- A先 0 1 2,再 0 1 2
- B先 3 3 3,再 0 1 2
- C先 0 1 2,再 3 3 3
- D先 3 3 3,再 3 3 3
▶看答案与解析
正确答案:B. 先 3 3 3,再 0 1 2
🐱 var i 是三个回调共享的同一个绑定;定时器触发时循环早已结束,i 是 3。let j 每轮迭代创建一个新绑定,所以每个回调闭包住自己那份值。紧跟着的追问通常是:不换关键字怎么修 var 版本——每轮套一个 IIFE,(function(i){ setTimeout(() => console.log(i)); })(i),这正是 ES6 之前用来替代的老写法。