当前位置:首页 > setTimeout和for循环那点事情

setTimeout和for循环那点事情

发布于 2019-11-29 阅读 1129 次 Javascript

今天面试遇到的面试题,当时有点懵,结束后反过劲儿了。在这里说说。

题目

  1. for(var i=0;i<5;i++){
  2. setTimeout(function(){
  3. console.log(i)
  4. },1000)
  5. }
  6. console.log(i)
  7. //输出结果: 5 5 5 5 5 5
解释下:

第一个5 是第二个console.log输出的,后面五个5是延迟1s后几乎同时输出
循环结束后i变成5,第一个console同步任务所以最先输出,循环几乎同时产生5个异步任务(settimeout)。

题目二

将上面的结果间隔不变数字输出变成501234

答案

1.直接将var变成let,因为let是块级作用域,所以每次循环都是不同的作用域。
2.利用闭包,将setTimeout用一个匿名函数包裹起来。

  1. for(var i=0;i<5;i++){
  2. (function(i){
  3. setTimeout(function(){
  4. console.log(i)
  5. },1000)
  6. })(i)
  7. }
  8. console.log(i)

题目三

将结果变成没隔1s输出一个数字,结果是501234
1:

  1. // 利用递归
  2. var n = 0;
  3. function fun(){
  4. console.log(n);
  5. if(n<4){
  6. n++;
  7. setTimeout(fun,1000)
  8. }
  9. }

更好的答案

  1. for(let i=0;i<5;i++){
  2. setTimeout(function(){
  3. console.log(i)
  4. },i*1000)
  5. }
  6. console.log(i)