function repeat(operation, num) {
if (num <= 0) return
operation()
if (num % 10 === 0) {
setTimeout(function() {
repeat(operation, --num)
})
} else {
repeat(operation, --num)
}
}
简单地说就是:现在要做一件事情(即执行函数operation
),而且要重复执行很多很多次,次数用num
表示。
但是,假设这个操作比较耗时,而且次数很大,比如100000万次,那么就会造成其他任务阻塞。例如,页面无法响应用户。
怎么办呢?办法就是执行10次后歇一下,让其他任务有机会执行。然后再执行10次,再歇一下。如此反复,直到最后。
那么所谓的“歇一下”是怎么实现的呢?答案就是通过setTimeout
函数。这个函数的作用就是将指定的函数的延迟执行,或者说放到下一轮或将来的某一轮事件循环中,从而给其他代码的执行让出了机会。
关于事件队列,可参考我专栏的一篇文章
if(num <= 0){
return;
}else{
operation()
}
//我来一句一个注释告诉你~手把手教学,你会喜欢的,没错,我就是来拿分的!!
function repeat(operation, num) { //这个是一个函数声明,传入两个参数operation, num
if (num <= 0) return; //如果num小于等于0 就返回了这个函数,没做什么事
operation(); //然后没返回的话,就触发一个叫operation的函数,这个函数在别的地方
if (num % 10 === 0) { //如果这个num能整除个10,就进去这个if语句
setTimeout(function() { //这里一个计时器,里面放一个函数,repeat也是一个函数,
repeat(operation, --num); //但是这个setTimeout缺少了一个延迟参数就是毫秒数
});
} else {
repeat(operation, --num);
}
}
任务阻塞,事件队列,学到了。。