这是一个异步的处理加闭包的问题,setTimeout或者setInterval不可避免 方案1async/await+Promise+setTimeout+while
function repeat(fn, num, delay) {
return async function (str) {
while (num) {
await new Promise(res => {
setTimeout(function () {
fn(str);
num--;
res()
}, delay)
})
}
}
}
var repeatFunc=repeat(console.log,4,3000);
repeatFunc('hellow world')
方案2 setnterval+clearInterval
function repeat(fn, num, delay) {
return function (str) {
var timer=setInterval(function (params) {
fn(str);
num--;
if(num===0){
clearInterval(timer)
}
},delay)
}
}
var repeatFunc=repeat(console.log,4,3000);
repeatFunc('hellow world')
方案3 setTimeout+fn
function repeat(fn, num, delay) {
return function (str) {
function parint() {
setTimeout(function () {
fn(str);
num--;
if (num > 0) {
parint();
}
}, delay)
}
parint()
}
}
var repeatFunc = repeat(console.log, 4, 3000);
repeatFunc('hellow world')
方案4 setTimeout+for未考虑执行时间,不严谨
function repeat(fn, num, delay) {
return function (str) {
var j = 1;
for (let i=1;i<= num;i++) {
setTimeout(function (params) {
fn(str)
}, delay * i)
}
}
}
var repeatFunc = repeat(console.log, 4, 3000);
repeatFunc('hellow world')