call(),apply(),bind() -日常打卡(2)

124 阅读2分钟

作用

在js中,所有的函数再被调用的时候都会默认传入两个参数,一个是this,还有一个是arguments。在默认情况下this都是指当前的调用函数的对象。但是有时候我们需要改变this的指向,也就是说使函数可以被其他对象来调用,那么我们应该怎样做呢?这时候我们就可以使用call,apply和bind方法了。 换句话说就是改变函数体内部 this的指向

三者相同点

作用相同,改变this的指向;

不同点

参数不同:

  • call(obj,参数1,参数2,参数3,...,参数n);这里传的参数,用“,”隔开
  • apply(obj,[参数1,参数2,参数3,...参数n]);这里传的是参是以数组的形式传进去的
  • bind(obj,参数1,参数2,参数3,...,参数n)();传参方式和call相同,这里bind 方法后面多了个 () ,因为它返回的是一个新的函数,所以需要调用它

个人感觉如果参数之间没用什么关联用call和bind好一点,如果有一定的关联,用apply好一点,

示例

var obj ={
    name:"小明",
    age:18,
    func:function(fm,t){
        console.log("姓名:"+this.name+",年龄:"+this.age+",想从"+fm+"去"+t);
    }
}
var db={
    name:"菜鸟",
    age:20,
}
obj.func()//姓名:小明,年龄:18想从undefined去undefined
obj.func.call(db,"上海","成都");//姓名:菜鸟,年龄:20想从上海去成都
obj.func.apply(db,["上海","成都"]);//姓名:菜鸟,年龄:20想从上海去成都
obj.func.bind(db,"上海","成都")();//姓名:菜鸟,年龄:20想从上海去成都

上面这段代码中,db想用obj里面func的方法,所以用call,apply,bind来改变func方法里的this指向,指向了db里面的name和age,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

上面就是自己学习时候的一些理解,如果有啥不对或者补充的地方,欢迎各位大佬指出来,我会及时改正的,谢谢!!!!!!