接着上次被问到的,如何用setTimeout实现setinterval,开始.....
1.如何实现?用递归
var i = 0;
function mySetInterval(callback, time) {
if (typeof callback !== "function"){
throw new Error('the frist parameter not a function')
}
// 初始版本
// 存在问题: Uncaught RangeError: Maximum call stack size exceeded
// setTimeout(callback, time);
// mySetInterval(callback, time);
// 第二版本
//解决初始版本的问题:如何解决栈溢出
// setTimeout(() => {
// //存在问题:控制台没有打印出来,回调没有执行
// mySetInterval(callback, time);
// }, time);
// 第三版本
//解决第二版本的问题:如何让回调执行
setTimeout(() => {
callback();
mySetInterval(callback, time);
}, time);
}
//test
mySetInterval(() => {
console.log(i++);
}, 1000);
2.拓展 setInterval的第三个参数
// 拓展:setInterval第三个参数,是回调函数的参数
// 回调函数中参数i是局部变量
// setInterval(console.log, 1000,i++); //0
// setInterval((i)=>console.log(i++),1000,i); //0
// 这个i是全局中的i
setInterval(() => { console.log(i++) }, 1000); //1,2,3...n