JS-bind跟call跟apply的理解

112 阅读2分钟

关于js中bind,call,apply的理解

引言:我们常常会很迷惑,js中bind,call,apply是我们经常见到又搞不清是怎么用的一个工具,它们之
间又有什么区别呢?

举个栗子:

--- 生活中,我们如果想开空调但是没有遥控器,这时候我们想到的是什么?对,借一个邻居的空调遥控器! 那么,这个借就是将别人的东西拿来为自己所用。那么,call,bind,apply亦是如此。

在从这个栗子出发,去结合代码实际分析下,到底是怎么"借"呢?

假设有这个一个对象

const obj = {
        name: '邻居家的空调',
        fn() {
          console.log('打开' + this.name);//打开邻居家的空调
        },
      };
      
obj.fn();

那么对象中,有一个邻居家的空调,有一个邻居家打开空调的方法(遥控器)

我们在定义一个对象表示自己家的情况

  const myObj={
        name:'自己家的空调',
      }

很明显,我们自己家的空调没用对于的方法(遥控器),那么按照上述所说,我们需要借用邻居家的空调(fn方法)来实现我们的目的,问题是我们怎么借呢?

其实call,apply,bind都是可以借的

先说 call

我们可以这么使用

const myObj={
        name:'自己家的空调',
      }
//obj.fn表示邻居家的空调,call表示借,myObj表示借给的人
obj.fn.call(myObj)//打开自己家的空调

call后面跟的对一个参数可以理解为这个函数为谁所用,也就是我们上述说的"借主",然后他后面可以跟多个参数,表示传入该函数的参数

obj.fn.call(myObj,'第一个7号电池','第二个7号电池')

fn(a,b) {
    console.log(a,b);//第一个7号电池 第二个7号电池
},

再说apply

apply跟call是一样的,不同的地方是传入参数的方式,call是一个个参数传入,而apply传入的是一个数组

//obj.fn表示邻居家的空调,apply表示借,myObj表示借给的人
obj.fn.call(myObj,['第一个7号电池','第二个7号电池'])

最后说bind

bind不同的是,它调用后得到一个函数,需要我们再次调用它,它传入的参数跟call是一样的形式。相当于说,我们向邻居借了个遥控器,邻居说:"我已经准备好了,你自己过来拿"

//obj.fn表示邻居家的空调,bind表示借,myObj表示借给的人
const bindFn=obj.fn.bind(myObj,'第一个7号电池','第二个7号电池')
console.log(bindFn);//ƒ fn(a,b) {...}
bindFn()//打开自己家的空调

综上所述,我们使用call,apply,bind这些方法,往往都是我们函数内this指向出现了问题,需要我们理清楚,哪个函数应该为谁所用的问题。如果理清楚了这些,一切都清晰明了了。

---over