事件队列函数回调

时间:2015-10-25 19:14:53

标签: javascript

function a() {
    for(i=0;i<4;i++){
        b(i);
    }
}

function b(j){
    setTimeout(function(){
        console.log(j);
    },3000);
}

a();

有人可以向我解释如何根据事件队列和执行上下文执行上述代码吗?

根据我对JS的理解,我知道直到JS文件中的所有代码都完成后才会处理事件队列。所以首先在全局范围内调用a。然后在函数a()内部,出现一个for循环,它调用b四次。所以我的问题是在每次调用函数b时,会在事件队列中放置一个计时器事件。此计时器事件是否等待三秒,然后回调传递给setTimeout方法的函数?或者它只是在队列上放置一个计时器事件,然后返回到函数a,再次调用b,这将在队列中放置另一个计时器事件。所以基本上直到for循环没有完成调用b四次,3秒的定时器事件将不会启动。但是当它完成调用b四次时,放置在队列上的第一个计时器事件开始并回调传递给setTimeout参数的函数,并且因为闭包它知道j = 0.然后这发生在下一个队列中有3个事件?所以基本上直到JS文件中的所有代码都完成才处理事件,在这种情况下,它是函数b的三次调用?

如果我的理解完全错误,请在不阅读我的解释的情况下,以自己的方式解释上面的代码哈哈!

1 个答案:

答案 0 :(得分:3)

  

此计时器事件是否等待三秒钟,然后回调传递给setTimeout方法的函数?或者它只是在队列上放置一个计时器事件,然后返回到函数a,再次调用b,这将在队列中放置另一个计时器事件。

后者。

撇开不会花费3秒钟来调用b 4次这一事实,JavaScript将永远不会在函数中间暂停以运行另一个函数,因为事件已被触发。忙于运行a()以查看是否有任何超时事件等待运行。