setTimeout(.. 0)排序

时间:2018-08-10 10:37:08

标签: javascript asynchronous callback settimeout

在学习JS期间,以下代码对我来说是个神秘的事物。

以下代码永远不会打印出“这是fn”?

我不确定fn=null;总是在的回调函数之前首先被调用 setTimtout(..,0)

function fn(){
    console.log('this is fn');
}

var intv = setTimeout( function(){ 
    intv = null;
    if (fn) fn();
}, 0 ); 

fn = null;

3 个答案:

答案 0 :(得分:2)

因为这就是它的工作方式。 setTimeout的回调函数将被推入队列,直到堆栈变空。

分配fn = null;后,堆栈将变空。

现在,事件循环将把回调推入堆栈,因为它将为空,因此它将执行,并且由于fn不再是一个函数,而是null,所以不会执行任何console.log。 / p>

答案 1 :(得分:2)

在以下情况下,超时将无法运行该功能

  • 超时已经过去
  • 最小超时时间已过去
  • 事件循环不忙于运行其他代码

所以你:

  1. 定义一个函数
  2. 定义超时时间
  3. fm设置为空

在此阶段,事件循环不再忙碌。

如果没有超过最小超时时间,那么JS会稍等。

然后调用该函数。

fnnull

答案 2 :(得分:1)

您需要了解JavaScript如何执行任何功能。该数据结构称为“调用堆栈”

  

调用堆栈:-它是一个数据结构,用于记录函数调用,基本上是我们在程序中的位置。如果我们调用一个函数   execute,我们将东西压入堆栈,当我们从   功能,我们从堆栈顶部弹出。

在您的情况下,完整脚本本身就是第一个调用,我们可以将其称为main。

所以堆栈中的第一个条目是

function fn(){
    console.log('this is fn');
}

var intv = setTimeout( function(){ 
    intv = null;
    if (fn) fn();
}, 0 ); 

fn = null;

在该代码中,设置的超时是执行第一个条目之后的第二次调用。

var intv = setTimeout( function(){ 
        intv = null;
        if (fn) fn();
    }, 0 ); 

现在,JavaScript调用堆栈将执行第一个条目,该条目在最后一行将fn的值设置为null。

然后它将执行超时间隔函数,其中fn为null。如果(fn)返回false,则什么也不会执行。