手写 bind
function bindThis(f, oTarget) { if (typeof f !== "function") throw new TypeError(f + " must be a function"); let o = Object(oTarget); let args = [].slice.call(arguments, 2); let bound = function (...boundArgs) { let finalArgs = [...args, ...boundArgs]; if (this instanceof bound) { if (f.prototype) { bound.prototype = Object.create(f.prototype); } let res = f.apply(this, args); if (typeof res === "object" || typeof res === "function") { return res; } return this; } else return f.apply(o, finalArgs); }; return bound; }