Skip to content

分别用6行代码实现bind、call和apply #2

Description

@hans000

命名为bindX、callX、applyX

bind

Function.prototype.bindX = function() {
  let self = this
  let [thisArg, ...args] = arguments
  return function() {
    self.apply(thisArg, [...args, ...arguments])
  }
}

call

Function.prototype.callX = function () {
  let [thisArg, ...args] = arguments
  let fn = Symbol()
  thisArg[fn] = this
  let result = thisArg[fn](...args)
  delete thisArg[fn]
  return result
}

apply

Function.prototype.applyX = function () {
  let [thisArg, args] = arguments
  let fn = Symbol()
  thisArg[fn] = this
  let result = thisArg[fn](...args)
  delete thisArg[fn]
  return result
}

说它多有用吧,真的没多大意义,仅仅是个人拿来玩的,退一万步讲,即便在某种情况下没有原生的bind,call,appay的支持,项目中也会用别人已经写好的。

如果硬要说些什么,那应该是js真的越来越好用了,要善加利用(⊙o⊙)哦

个人的一些感悟

  • 保存当前对象this
  • 保存绑定对象thisArg
  • 保存剩余参数
  • 根据具体功能处理
    • bind 返回的是函数
    • call 返回的是函数执行的结果,剩余参数是展开形式
    • apply 返回的是函数执行的结果,剩余参数是数组形式

您可以查看MDN上比较权威的实现

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions