今天面试遇到的面试题,当时有点懵,结束后反过劲儿了。在这里说说。
题目
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i)
},1000)
}
console.log(i)
//输出结果: 5 5 5 5 5 5
解释下:
第一个5 是第二个console.log输出的,后面五个5是延迟1s后几乎同时输出
循环结束后i变成5,第一个console同步任务所以最先输出,循环几乎同时产生5个异步任务(settimeout)。
题目二
将上面的结果间隔不变数字输出变成501234
答案
1.直接将var变成let,因为let是块级作用域,所以每次循环都是不同的作用域。
2.利用闭包,将setTimeout用一个匿名函数包裹起来。
for(var i=0;i<5;i++){
(function(i){
setTimeout(function(){
console.log(i)
},1000)
})(i)
}
console.log(i)
题目三
将结果变成没隔1s输出一个数字,结果是501234
1:
// 利用递归
var n = 0;
function fun(){
console.log(n);
if(n<4){
n++;
setTimeout(fun,1000)
}
}
更好的答案
for(let i=0;i<5;i++){
setTimeout(function(){
console.log(i)
},i*1000)
}
console.log(i)