手写js源码系列

97 阅读1分钟

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指向赋值