1. 防抖
function debounce(func, ms = 500) {
let timer;
return function (...args) {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
func.apply(this, args);
}, ms);
};
}
复制代码
2. 节流
function throttle(func, ms) {
let canRun = true;
return function (...args) {
if (!canRun) return;
canRun = false;
setTimeout(() => {
func.apply(this, args);
canRun = true;
}, ms);
};
}
复制代码
3. new
function myNew(Func) {
const instance = {};
if (Func.prototype) {
Object.setPrototypeOf(instance, Func.prototype);
}
const res = Func.apply(instance, [].slice.call(arguments, 1));
if (typeof res === "function" || (typeof res === "object" && res !== null)) {
return res;
}
return instance;
}
复制代码
4. bind
Function.prototype.myBind = function (context = globalThis) {
const fn = this;
const args = Array.from(arguments).slice(1);
const newFunc = function () {
if (this instanceof newFunc) {
// 通过 new 调用,绑定 this 为实例对象
fn.apply(this, args);
} else {
// 通过普通函数形式调用,绑定 context
fn.apply(context, args);
}
};
// 支持 new 调用方式
newFunc.prototype = fn.prototype;
return newFunc;
};
复制代码
5. call
Function.prototype.myCall = function (context = globalThis) {
// 关键步骤,在 context 上调用方法,触发 this 绑定为 context
context.fn = this;
let args = [].slice.call(arguments, 1);
let res = context.fn(...args);
delete context.fn;
return res;
};
复制代码
6. apply
Function.prototype.myApply = function (context = globalThis) {
// 关键步骤,在 context 上调用方法,触发 this 绑定为 context
context.fn = this;
let res;
if (arguments[1]) {
res = context.fn(...arguments[1]);
} else {
res = context.fn();
}
delete context.fn;
return res;
};
复制代码