按照js的原理,事件处理函数是回调,应该事件触发后把绑定的函数添加到任务队列等待下一轮事件循环才执行,得等任务队列的回调,但图中的主线程的所以程序执行完才执行,但图中的代码最先输出2,然后才输出for循环的1,for没执行完怎么就执行任务队列的回调了,求解
输入结果是对的,在a.click()开开始执行方法,输出2,然后就是舒心执行1.....接下来定时器执行354
因为 setTimeout.
调用 setTimeout 后会在等待时间后再执行代码,
也就是说执行到 setTimeout(function () {console.log(3)},0); 并不立即执行要等待0毫秒再执行.
那么问题来了. 如果是等待0毫秒执行. 那输出结果应该是
3 5 2 1 4 ;
因为执行 for的时间应该会超过 0毫秒.
这是为因为 js 的解析机制引起的.
js会优先解析后整个js块. 然后再调用setTimeout.
所以输出的结果就成了
2 1 3 5 4
一段js代码(里面可能包含一些setTimeout、鼠标点击、ajax等事件),从上到下开始执行,遇到setTimeout、鼠标点击等事件,异步执行它们,此时并不会影响代码主体继续往下执行(当线程中没有执行任何同步代码的前提下才会执行异步代码),一旦异步事件执行完,回调函数返回,将它们按次序加到执行队列中,这时要注意了,如果主体代码没有执行完的话,是永远也不会触发callback的
必须得正确理解事件绑定和setTimeout
事件绑定,是一被回调就执行的.具体可以参照下自定义Event,Event类似于一个obsever,管理了一堆绑定数组,每个事件对应一堆回调,一emit事件,即执行回调函数
而setTimeout是将执行代码放在主线程之外的,即主线程执行完你上面这段代码后,tmeout为0才开始执行,以此类推
或许你误会了,并不是所有的回调都是异步的,有同步回调和异步回调。
代码中a.click()直接就同步调用了a.onclick方法,没有经过异步处理,所以2是最先输出的,循环在其后。