setInterval 问题
有错误不会停止
多个定时器代码执行之间的间隔可能会比预期小
间隔会被跳过
要求用闭包实现每隔5s输出0-9之间的十个数字
(function timer (){
var i = 0
setTimeout(function() {
console.log(i)
i++
if(i< 10 ){
setTimeout(arguments.callee, 1000);
}
}, 1000);
}
)()
递归调用
function b (num){
if(num > 0 ){
setTimeout(function(){
console.log(num)
num --
b (num)
},1000)
}
}
执行环境
执行环境定义了变量和函数的有权访问的其他数据,决定各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中。
作用域链
函数在定义时创建的,
计时器
正计时 倒计时
根据传入 order : down 倒计时
up 正计时
const countDown = (order: string, miu?: number) => {
// order >> down倒计时 up计时
let counter: any = '';
clearTimeout(intervalRef.current);
let timeCount = 0;
//倒计时
let ms = miu ? miu * 1000 : 0;
const interval = 1000,
startTime = new Date().getTime(); //执行时间
counter = setTimeout(countDownStart, interval);
intervalRef.current = counter;
function countDownStart() {
timeCount++;
//程序运行到此并没有做倒计时作用 会产生时间误差
let offset = new Date().getTime() - (startTime + timeCount * interval);
//清除时间误差
let nextTime = interval - offset;
// 误差超过一秒立即执行 避免长时间 大误差
if (nextTime < 0) {
nextTime = 0;
}
if (order === 'down') {
ms -= interval;
if (ms < 0) {
clearTimeout(intervalRef.current);
} else {
let minute = Math.floor(ms / 1000 / 60);
let second = Math.floor((ms / 1000) % 60);
console.log(minute ,second )
counter = setTimeout(countDownStart, 1000);
intervalRef.current = counter; //清除定时器用 得到的是定时的id
}
} else {
ms += interval;
let minute = Math.floor(ms / 1000 / 60);
let second = Math.floor((ms / 1000) % 60);
console.log(minute ,second )
counter = setTimeout(countDownStart, 1000);
intervalRef.current = counter; //清除定时器用 得到的是定时的id
}
}
};