《JavaScript那些事》--简单实现bind

简单实现bind

bind和apply、call一样,能够改变this的指向,从而改变执行函数的执行上下文。
那么可不可以自己实现下bind的功能呢?

明确bind功能

  1. 改变this指向
  2. 返回一个可实现函数
  3. 接收多个参数转为返回函数的形参

实现前的准备

var obj = {
  name: "旺财",
  say: function () {
    console.log(this.name);
  },
};

var foo = {
  name: "小白",
};

代码实现

Function.prototype._bind = function () {
  let args = Array.from(arguments);
  //获取执行上下文
  let _this = args.shift();

  //获取执行函数
  let runFunc = this;

  //返回新的执行函数
  return function () {
    let newArgs = Array.from(arguments);
    let resArgs = args.concat(newArgs);
    //使用apply进行绑定
    return runFunc.apply(_this, resArgs);
  };
};
obj.say._bind(foo)();//小白

完整代码

var obj = {
  name: "旺财",
  say: function () {
    console.log(this.name);
  },
};

var foo = {
  name: "小白",
};

Function.prototype._bind = function () {
  let args = Array.from(arguments);
  let _this = args.shift();
  let runFunc = this;

  return function () {
    let newArgs = Array.from(arguments);
    let resArgs = args.concat(newArgs);

    return runFunc.apply(_this, resArgs);
  };
};
obj.say._bind(foo)();

一些问题

由于简单实现,所以有很多问题有待解决。

  1. runFunc的类型没有进行判定
  2. apply的绑定也能重新进行实现,但此处没有
  3. 绑定构造函数时会出现绑定失败的问题
posted @ 2022-02-10 17:17  小虾米在code江湖  阅读(28)  评论(0编辑  收藏  举报