1 使用setTimeout实现setInterval
setInterval的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间将事件加入事件队列中去,只有在当前执行栈为空的时候,才会从事件队列中取出事件执行。
使用setTimeout递归调用来模拟setInterval,就可以确保只有一个事件结束了,才会触发下一个定时器事件,这样解决了setInterval的问题。
实现思路是使用递归函数,不断地去执行setTimeout从而达到setInterval的效果。
function mySetInterval(fn, timeout) {
let timer = { flag: true };
function interval() {
if (timer.flag) {
fn();
}
setTimeout(interval, timeout);
}
setTimeout(interval, timeout);
return timer;
}
2 实现jsonp
function addScript(src) {
let script = document.createElement('script');
script.src = src;
script.type = 'text/javascript';
document.body.appendChild(script);
}
function handleRes(res) {
console.log(res);
}
addScript("http://xxx.xxx.com/xxx.js?callback=handleRes");
handleRes({ a: 1, b: 2 });