实现 JavaScript 的 bind,apply,call 方法

160 阅读1分钟

实现 Function.prototype.bind 方法

function bind (fn, obj) {
  var args = []
  for (var i = 2; i < arguments.length; i++) {
    args.push(arguments[i])
  }
  return function () {
    for (var i = 0; i < arguments.length; i++) {
      args.push(arguments[i])
    }
    // apply 方法的实现在下文
    return apply(fn, obj, args)
  }
}

实现 Function.prototype.apply 方法

function apply (fn, obj, args) {
  const tmpFn = String(new Date().getTime())
  Object.defineProperty(obj, tmpFn, {
    configurable: true,
    enumerable: false,
    writable: false,
    value: fn
  })
  var statement = 'obj[tmpFn]('
  for (var i = 0; i < args.length; i++) {
    statement += 'args[' + i + '], '
  }
  if (i > 0) {
    statement = statement.slice(0, -2)
  }
  statement += ')'
  var result = eval(statement)
  delete obj[tmpFn]
  return result
}

实现 Function.prototype.call 方法

function call (fn, obj) {
  var args = []
  for (var i = 2; i < arguments.length; i++) {
    args.push(arguments[i])
  }
  // 直接调用上面实现的 apply 方法
  return apply(fn, obj, args)
}