每次执行定时器后,都获取系统时间进行修正,对后面运行时间有一个补偿。
function timer(){
//闭包环境下的变量
var speed = 1000, counter = 1, start = new Date().getTime();
function calibration () {
//理想状态下,定时器总执行时间
var ideal = counter * speed,
//实际执行时间
real = (new Date().getTime() - start),
//偏差值,正常情况下,会一直往后延迟
diff = (real - ideal);
//执行次数+1
counter++;
//补偿偏差
window.setTimeout(function () { calibration(); }, (speed - diff));
};
//第一次执行
window.setTimeout(function () { calibration(); }, speed);
},
在js中所有函数都可以访问上一层作用域,父函数中定义子函数,子函数可以访问父函数中的值,子函数相当于一个闭包函数。父函数调用子函数进行计数,counter不会被重置,且不能被外部所改变,只有重新调用父函数,才会重置