【问题标题】:clearInterval function working mysteriouslyclearInterval 函数神秘地工作
【发布时间】:2018-05-15 19:27:49
【问题描述】:

我们都知道一个函数在完成时可以返回一个值。 现在考虑以下代码行

var t = setInterval(function() {
  console.log('hey hi hello now 2 seconds have passed down');
} ,2000);
clearInterval(t);

现在,clearInterval()setInterval() 函数返回的唯一 id 作为参数,并且只有在函数完全运行后才会返回。在我的代码中发生的情况是,在我的 setInterval() 函数运行之前,它会被清除,这应该是不可能的,因为 setinterval() 在其回调函数被调用之前不会返回任何内容。

clearInterval() 函数如何能够在setinterval() 函数之前运行?

【问题讨论】:

  • “因为 setinterval() 在调用它的回调函数之前不会返回任何东西。” 是什么让你这么认为?
  • Setinterval( ) 函数只有在我假设的回调函数被执行一次时才会完成。

标签: javascript function order-of-execution


【解决方案1】:

发生的情况是您在代码的第一行第一次调用setInterval 函数,它会为它返回一个ID

这个ID与函数的调用无关,之后告诉JS去掉这个区间。所以什么都不会发生。

这些是发生的步骤:

 // Step #1 
 var t = setInterval(
    // Step #3
    function () {console.log('hey hi hello now 2 seconds have passed down');}

  , 2000);
clearInterval(t);// Step #2

所以问题是您在调用函数之前清除了间隔。但在声明之后。

Wrong!

1- 声明 -> 清除 -> 调用

Correct

1- 声明 -> 调用 -> 清除

作为解决方案:

setInterval 内调用clearInterval

像这样:

var t = setInterval(function () {
    console.log('hey hi hello now 2 seconds have passed down');
    clearInterval(t);
}, 2000);

【讨论】:

  • 我知道我只想知道我的 clearInterval() 函数是如何在我的 setInterval() 函数之前执行的,因为它只会在 setInterval() 函数返回一个值时运行。
  • @HARSHBAJPAI 请检查我的答案的新版本。
【解决方案2】:

setinterval() 在其回调函数被调用之前不会返回任何内容

这完全不正确。设置间隔立即返回唯一句柄,因此您甚至可以在第一个函数运行之前删除间隔。 callback 函数,因此您传递给setInterval 的第一个参数在运行之前不会返回任何内容。但即使在运行之后,它的返回值也永远不会分配回变量 hlding 唯一句柄(在您的情况下 - var t)。

setInterval 把一段代码放到栈底,所以剩下的代码在它之前被执行。实际上,您在函数执行之前清除了间隔。

【讨论】:

  • @HARSHBAJPAI 您评论中的代码与问题相关的具体内容有什么关系?