手写call

手写call

方法一:ES6

Function.prototype.call2 = function (context, ...args) {
  context = context || globalThis;
  const _symbol = Symbol();
  context[_symbol] = this;
  let result = context[_symbol](...args);
  delete context[_symbol];
  return result;
}

方法二:ES5

Function.prototype.call3 = function (context) {
  context = context || globalThis;
  const _symbol = Symbol();
  context[_symbol] = this;
  let args = [];
  for (let i = 1, len = arguments.length; i < len; i++) {
    args.push('arguments[' + i + ']');
  }
  //使用eval,args会直接调用toString()
  let result = eval('context[_symbol](' + args + ')');
  delete context[_symbol];
  return result;
}

参考文献

[1]如何模拟实现call、apply函数