来来来,看下面这段代码:
1 | let start = new Date() |
while 之前就设置了定时器,并添加到队列里面(假设时间点 a), while 执行了1000ms 之后线程去队列里面取,发现 a + 1000ms > a + 500ms 说明 setTimeout 已经可以被执行了,不需要再等 500ms。
setTimeout的应用:
1 | document.querySelector(#one_input).onkeydown = function() { |
当你往两个表单输入内容时,你会发现未使用setTimeout函数的只会获取到输入前的内容,而使用setTimeout函数的则会获取到输入的内容。
这是为什么呢?
因为当按下按键的时候,JavaScript 引擎需要执行 keydown 的事件处理程序,然后更新文本框的 value 值,这两个任务也需要按顺序来,事件处理程序执行时,更新 value值(是在keypress后)的任务则进入队列等待,所以我们在 keydown 的事件处理程序里是无法得到更新后的value的,而利用 setTimeout(fn, 0),我们把取 value 的操作放入队列,放在更新 value 值以后,这样便可获取出文本框的值。
setTimeout可以传入第三个参数、第四个参数….,它们表示神马呢?其实是用来表示第一个参数(回调函数)传入的参数。