昨天去了某真香互联网公司面试,面试官写了一段setTimeout的代码(见下文),问我打印出来什么,其实特别简单,是基础知识,我......脑袋里排山倒海般,各种想法在脑袋里打架,就是不知道正确答案,所以今天自己码了一下。
题目
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
打印结果
分析
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
该方法是异步的,每次for循环的时候setTimeout都会执行,但是里面的function则不会执行,而是被放入任务队列,因此放5次;for循环的5次执行完之后还不到1秒。只有主线上的全部执行完之后,才会执行任务队列里的任务,所以当主线程for循环执行完之后 i 的值为5,这个时候再去任务队列中执行任务,i全部为5;
扩展
如果把var 换成 let 呢?
因为 let 是区块变量,每个 i 只能存活到大括号结束,并不会把后面的 for 循环的 i 值赋给前面的setTimeout中的 i;而 var 是局部变量,这个 i 的生命周期不受for循环的大括号限制。