js

JavaScript setTimeout()初试

Posted by Ethan on 2019-11-09

setTimeout()延迟任务执行

setTimeout(fn,t),超时调用,超过时间t,就执行fn。

setTimeout(fn,t)中t告诉JS再过多久把当前任务添加到队列中,并不是执行的到setTimeout就添加任务。如果队列是空,那么添加的代码会立即执行;如果队列不空,那么它就要等前面的代码执行完了以后在执行。

代码示例:

1
2
3
setTimeout(() => {
$(`input[name='Layout_icon'][value=${this.layout}]`).attr('checked','true');
}, 30);

此代码实现延迟30ms执行元素赋值操作。

总结:

JS是一个单线程的解释器,因此一段时间内只能执行一段代码。为了要控制执行的代码,就有一个JS任务队列。这些任务会按照将它们添加到队列的顺序执行。

在处理DOM点击事件的时候通常会产生冒泡,正常情况下首先触发的是子元素的handler,再触发父元素的handler,如果我想让父元素的handler先于子元素的handler执行应该怎么办?那就用setTimeout延迟子元素handler若干个毫秒执行吧。问题是这个“若干个”毫秒应该是多少?可以是0。

异步任务

JS中存在一个内部的任务队列,用于存储异步任务(setTimeOut,点击事件的回调函数等)。

其实,通俗来说同步的任务会按照代码顺序来执行函数,而异步的(当前就是setTimeOut会加入任务队列,即使它的delay为0)。