一段有趣的代码,关于循环内的异步栈以及变量声明

一段有趣的代码,关于循环内的异步栈以及变量声明

function fn1(){
  for(var i=0;i<4;i++){
    var tc=setTimeout(function(i){
      console.log(i);
      clearTimeout(tc)
    },10,i);
  }
}

function fn2(){
  for(var i=0;i<4;i++){
    var tc=setInterval(function(i,tc){
      console.log(i);
      clearInterval(tc)
    },10,i,tc);
  }
}

fn1();
fn2();

fn1 异步栈

循环内会先执行完毕,clearTimeout 中 tc的值永远是最后一个 setTimeout 的 timerId。 因此只是清除了 i = 3 时的定时器。

输出: 0 1 2

fn2 变量定义

先定义tc,再传值。代码可拆分为

var tc;
tc = setInterval(function() {
  console.log(i);
  clearInterval(tc)
}, 10, i, tc)

因此,第一次传入的 tc 值并不是 0 而是 undefined,clearIterval 实际上清除的是上一个定时器,而最后一个定时器永远无法清除。

输出 0 1 2 3 3 3 3 3..........

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容