想知道是否有人可以澄清以下内容:
// Gets fired 10000 times
fireEvent( function(){
console.log( 'first' );
setTimeout( ( function(){ console.log( 'second' ); } ), 100 );
});
这将输出10000 x“first”然后输出10000 x“second”。是因为console.log('first')在console.log('second')之前的事件循环中首先排队?
答案 0 :(得分: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();
}
这将打印“第一”一千次,然后“第二次”打印一千次。
在这种情况下,应该相当明显发生了什么:for循环在小于100秒的超时时间内完成,因此每次调用foo()都会打印'first'并在回调之前返回打印'第二个'有机会执行。
然而,这是有趣的一点,即使超时时间非常短(比如说5毫秒)并且循环运行了一百万次,你仍然可以“首次”打印一百万次,然后“第二次”获取打印了一百万次。 (即使循环现在执行的时间可能超过5毫秒)。
function foo() {
console.log( 'first' );
setTimeout( ( function(){ console.log( 'second' ); } ), 5);
}
for (var i = 0; i < 1000000; i++) {
foo();
}
这是因为setTimeout仅设置最小期间,之后将调用回调。 JavaScript是单线程的。如果事件触发(或回调的超时时间超时),则在没有任何操作的情况下执行其处理程序,即事件循环是否空闲。但是,如果超时触发,并且javascript事件循环繁忙,则回调(以及任何准备处理的后续事件等)将被放入队列,直到事件循环可以自由执行它们。
希望这有帮助。