0

想知道是否有人可以澄清以下内容:

// Gets fired 10000 times

fireEvent( function(){

  console.log( 'first' );

  setTimeout( ( function(){ console.log( 'second' ); } ), 100 );

});

这将输出 10000 x“第一”,然后是 10000 x“第二”。是因为console.log( 'first' ) 在console.log( 'second' ) 之前在事件循环中首先排队吗?

4

1 回答 1

4

您正在将一个函数(文字)传递给函数 fireEvent,该 fireEvent 可能会在某个时候调用……但您还没有粘贴 fireEvent 的代码,以便我们知道 fireEvent 究竟做了什么。另外,如何调用 fireEvent() ?它是否在循环中被调用 1000 次?

现在,希望下面的示例可能有助于理解正在发生的事情。

function foo() {
    console.log( 'first' );
    setTimeout( ( function(){ console.log( 'second' ); } ), 100 );

}

for (var i = 0; i < 1000; i++) {
    foo();
}

这将打印 'first' 一千次,然后打印 'second' 一千次。

在这种情况下,发生的事情应该很明显:for循环在不到100秒的超时时间内完成,因此它对 foo() 的每次调用都会打印“first”并在打印“second”的回调之前返回执行的机会。

然而,这是有趣的一点,即使超时时间非常短(比如 5 毫秒)并且循环运行了一百万次,您仍然会得到“第一”打印一百万次,然后“第二”打印一百万次次。(即使现在执行循环可能需要超过 5 毫秒)。

function foo() {
    console.log( 'first' );
    setTimeout( ( function(){ console.log( 'second' ); } ), 5);

}

for (var i = 0; i < 1000000; i++) {
    foo();
}

发生这种情况是因为 setTimeout 仅设置调用回调的最短时间。JavaScript 是单线程的。如果事件触发(或回调的超时时间超时),如果没有发生任何事情,即如果事件循环空闲,则将执行其处理程序。但是,如果超时触发,并且 javascript 事件循环很忙,则回调(以及任何准备处理的后续事件等)将被放入队列中,直到事件循环可以自由执行它们。

希望这可以帮助。

于 2012-09-17T14:14:26.697 回答