乐趣区

setTimeout的返回值

谈谈我对 js 中 timer 的认识

setTimeout()的返回值
今天遇到一个问题,题目如下:

复制代码

var len=4;
while(len--){setTimeout(function(){console.log(len); 
  },0); 
  console.log(len); 
};

复制代码

问:输出是什么?

我的答案是打印 3,2,1,0,-1,-1,-1,-1

过程是先执行 console.log(len),执行了 4 次之后,再执行 4 次 setTimeout

问题很简单,但是我就想把 console.log(len) 去掉,如下:

var len=4;
while(len--){setTimeout(function(){console.log(len); 
  },0); 
};

这下会打印什么?

应该是 -1,-1,-1,- 1 对吧,但是很遗憾,在 chrome 的控制台下显示的是 15,-1,-1,-1,- 1 为什么多个 15,我就很好奇的在执行了一边这段代码,结果显示的是 19,-1,-1,-1,-1

再执行就是 23,-1,-1,-1,-1

很有有规律,这 4 个 - 1 前面的数字是什么?我发现它是每次循环的次数,但是刚打开我之前没有执行啊,第一次打印也不能是 15 啊

秉着知根知底的信念,就去谷歌了一下,发现这是 setTimeout 的返回值。为什么会有这么一个返回值呢,大家都知道 setTimeout 执行会被 clearTimeout 结束等待,它是靠什么结束的呢?是 ID,

大家可能不太相信,可以这样来尝试下:

复制代码

var len=4;
while(len--){var time=setTimeout(function(){console.log(len); 
  },0); 
};
console.log(time);

复制代码
这样就可以知道 time 是什么了吧。

退出移动版