// callFunction.prototype.call = function(ctx, ...args) { ctx = ctx || window; const fnSymbol = Symbol('fn'); ctx[fnSymbol] = this; ctx[fnSymbol](...args); delete ctx[fnSymbol];}// testfunction fn(c, d) { return this.a + c + d;}const obj = { a: 1}fn.call(obj, 2, 3); // 6
// applyFunction.prototype.apply = function(ctx, args) { ctx = ctx || window; const fnSymbol = Symbol('fn'); ctx[fnSymbol] = this; ctx[fnSymbol](...args); delete ctx[fnSymbol];}// testfunction fn(c, d) { return this.a + c + d;}const obj = { a: 1}fn.apply(obj, [2, 3]); // 6
// bindFunction.prototype.bind = function(ctx, ...args) { ctx = ctx || window; const fnSymbol = Symbol('fn'); ctx[fnSymbol] = this; return function (){ ctx[fnSymbol](...args); delete ctx[fnSymbol]; }}// testfunction fn(c, d) { return this.a + c + d;}const obj = { a: 1}fn.bind(obj, 2, 3); // 6