基本概念与用法就忽略了。主要是使用这两个定时器可能出现的问题:
this
由setTimeout与setInterval调用的代码运行在与所在函数完全分离的执行环境上。这会导致,这些代码中包含的 this 关键字在非严格模式会指向 window (或全局)对象,严格模式下为 undefined,这和所期望的this的值是不一样的。
- 在ES6中可以使用箭头函数来绑定外层this;
- 要么就是用bind进行硬绑定。
setTimeout(fn,0)
一般浏览器有一个最小间隔,因此虽然设置的是0,但也会在这个最小间隔之后才执行操作。
不同浏览器的最小间隔不同,一般为4ms。
setInterval失帧
setInterval是每隔一定间隔就试图将回调函数放入任务队列中。但当主线程代码运行时间过长的时候,此时任务队列中的代码不能运行。当setInterval发现任务队列中还有未执行的回调函数时,就不会再将当前的回调函数放入队列中,因此会跳过某些帧。
当使用setInterval()时,仅当没有该定时器的任何其他代码示例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔
为了解决setInterval这个问题,可以使用setTimeout来代替setInterval:
setTimeout(function bar(){
//一些代码
setTimeout(bar,delay);
},delay);
这里setTimeout一定会在上一次回调的代码执行完毕后再定时下一次的代码,保证不会跳过某些帧。