为什么clearTimeout会立即执行?

时间:2018-04-05 14:57:27

标签: javascript

枝!

我正在做一项测试任务,创建" slow_guard"如果传递给slow_guard的另一个函数执行时间太长,应该控制警告消息的函数。

这是我的代码(codepen):

function slow_guard(timeout, fn) {
  var timer = setTimeout(function() {
    console.log('Function lasts for more than ' + timeout/1000 + ' sec.!');
  }, timeout + 1);
  var start = new Date().getTime();
  fn();
  var end = new Date().getTime();
  var time = end - start;
  console.log('Execution time: ' + time);  
  clearTimeout(timer); 
  // if(time < timeout) { clearTimeout(timer); }
}

function longFunction() {
  for (i = 0; i < 7999000; ++i) {
  // do something
  }
}

slow_guard(1000, longFunction); 

但它不起作用。似乎clearTimeout不等待循环结束并立即执行 如果我使用Date进行额外的检查,它可以正常工作(您可以检查它是否用较低的注释代替clearTimeout(timer)代码。)
为什么会这样?!请解释一下!

1 个答案:

答案 0 :(得分:1)

setTimeout会将函数排队以便稍后运行,但如果您正在执行另一个函数,则不会中断它来解析排队函数。

JavaScript引擎在检查队列之前将完成运行slow_guard(包括clearTimeout调用)以查看是否有任何定时函数等待(由于你只是清除它。)