1:手写防抖函数(回城)
function debounce(fn, delay) {
let timer = null; //借助闭包
return function () {
if (timer) {
clearTimeout(timer); //进入该分支语句,说明当前正在一个计时过程中,并且又触发了相同事件。所以要取消当前的计时,重新开始计时
timer = setTimeout(fn, delay);
} else {
timer = setTimeout(fn, delay); // 进入该分支说明当前并没有在计时,那么就开始一个计时
}
};
}
setInterval(
debounce(() => {
console.log("函数执行");
}, 500),
1000
);
实现要领:利用闭包创建不被js垃圾销毁机制销毁的变量,每次运行查看time变量是否存在,如果存在则销毁变量重新计时,如果不存在则创建新的定时函数
2:手写节流函数(放技能)
function jie(fn, delay) {
let judge = true;
return () => {
if (judge) {
judge = false;
setTimeout(() => {
fn();
judge = true;
}, delay);
}
};
}
function a() {
console.log("我输出了");
}
setInterval(jie(a, 3000), 500);
实现要领:利用闭包创建出不被js垃圾清理机制销毁的变量,利用该变量判断此时是否应该执行定时函数,并在每次定时函数执行完毕之后重新将全局变量judge变为true,代表可以继续执行定时函数
3:手写new构造对象
function myNew(fn) {
let obj = {};
obj.__proto__ = fn.prototype;
fn.call(obj);
return obj;
}
function a() {
this.num = 10;
}
a.prototype.getnum = function () {
console.log(this.num);
};
let ins = myNew(a);
console.log(ins);
ins.getnum();
手动实现一个new函数,三步走,创建空对象,实现原型链绑定,函数this指向赋值