setTimeout和setInterval
要充分理解javaScript是运行于单线程环境的。
在javaScript中没有任何代码是立即执行的,但是一旦进程空闲下来就会尽快执行
setTimeout:指定的毫秒数后调用函数(引用函数)或计算表达式(js代码串)
//调用函数
function a() {
console.log(1231);
}
setTimeout(a, 1000);
// 计算表达式
function b(val) {
console.log(val);
}
setTimeout('b(1234)', 1000);
// 计算表达式
setTimeout('console.log(12312312);', 1000);
// 调用函数方式由于不能传参,可以通过闭包来实现。
function foo(a1,a2,a3){
return function () {
console.log(a1,a2,a3);
}
}
var c = foo(1,2,3);
setTimeout(c,1000);
// 对比var a = function(){} ;类似
setTimeout(function(a){
console.log(a)
},1000);
setTimeout定时器会在主线程空闲时会在指定时间后执行任务,若主线程忙碌状态,则会先把任务挂在异步队列,待主线程空闲后立即在指定时间后执行,所以实际发生前时间大于等于设定的时间
setInterval:可按照指定的周期(以毫秒计)来调用函数或计算表达式
- 问题:定时器代码在代码再次被添加到队列之前没有执行完成,导致定时器代码执行了好几遍setInterval。
- 缺点:1.某些间隔被跳过 2.多个定时器代码的执行间隔比预期小
解决上述两个缺点。可以采用链式setTimeout调用
setTimeout(function () {
setTimeout(arguments.callee, interval);
}, interval);
arguments.callee对当前执行函数的引用