美文网首页
js 实现call、apply、bind

js 实现call、apply、bind

作者: 摸摸大海参 | 来源:发表于2020-01-15 11:00 被阅读0次
什么是call、apply、bind?

共同点:调用一个function,并将function中的this指向指定的对象。
不同点:1、apply的参数中,除指定对象外,其余参数组合为一个数组作为第二个参数;
    2、call、apply返回函数执行完的结果,bind是返回一个function。

简单的例子:

var x = 1;
function add (y) {
    console.log(this.x + y)
}

add(2)    // 5, 非严格模式下,this 指向 window,所以 this.x 为 1

var obj = { x: 3 }
add.call(obj, 2)      // 5, this 指向 obj,所以this.x 即obj.x,2 作为参数 y 传递
add.apply(obj, [2])   // 5, this 指向 obj,所以this.x 即obj.x,注意第二个参数为数组
add.bind(obj, 2)()    // 5, 返回 this 指向 obj 的函数,this.x 即obj.x,2 作为参数 y 传递

实现call、apply、bind的重点就是将 this 指向指定的对象。看下面代码:

var obj = {
    a: 'text',
    showA: function () {
        console.log(this.a)
    }
}

obj.showA()    // text, this 指向 obj

所以,利用 obj.fn() 中 this 指向 obj 的特性就可以实现call、apply、bind!!!

call:
Function.prototype.myCall = function (context, ...argList) {
  context._fn = this;
  context._fn(...argList)
  delete context._fn    // 执行函数后删除该对象属性
}
apply:
Function.prototype.myApply = function (context, argList) {
  context._fn = this;
  context._fn(...argList)
  delete context._fn
}
bind(返回函数):
Function.prototype.myBind = function (context, ...argList) {
  // 不用call、apply实现
  context._fn = this;
  return () => {
    context._fn(...argList)
    delete context._fn
  } 
  
  // 用 call 实现 bind(apply类似)
  return () => {
    this.call(context, ...argList)
  }
}

相关文章

网友评论

      本文标题:js 实现call、apply、bind

      本文链接:https://www.haomeiwen.com/subject/snftzctx.html