setTimeout()延迟任务执行
setTimeout(fn,t),超时调用,超过时间t,就执行fn。
setTimeout(fn,t)中t告诉JS再过多久把当前任务添加到队列中,并不是执行的到setTimeout就添加任务。如果队列是空,那么添加的代码会立即执行;如果队列不空,那么它就要等前面的代码执行完了以后在执行。
代码示例:
1 | setTimeout(() => { |
此代码实现延迟30ms执行元素赋值操作。
总结:
JS是一个单线程的解释器,因此一段时间内只能执行一段代码。为了要控制执行的代码,就有一个JS任务队列。这些任务会按照将它们添加到队列的顺序执行。
在处理DOM点击事件的时候通常会产生冒泡,正常情况下首先触发的是子元素的handler,再触发父元素的handler,如果我想让父元素的handler先于子元素的handler执行应该怎么办?那就用setTimeout延迟子元素handler若干个毫秒执行吧。问题是这个“若干个”毫秒应该是多少?可以是0。
异步任务
JS中存在一个内部的任务队列,用于存储异步任务(setTimeOut,点击事件的回调函数等)。
其实,通俗来说同步的任务会按照代码顺序来执行函数,而异步的(当前就是setTimeOut会加入任务队列,即使它的delay为0)。