call,apply,bind的用法

call,apply和bind都用来改变js中this对象的指向

var dog = {
   name:'dog',
   speak: function(value){
       alert("i'm" + name + ", i can " + value);
   }
}

var cat = {
    name:'cat'
}            

 

1.call

        此时cat中没有我们想用的speak方法,可以用call来‘借用’dog的方法。

dog.speak.call(cat,'meow');
// i'm cat, i can meow

 

2.apply

        apply和call的用法类似,只是后面的传参是数组的格式。这个特性可以让apply在使用时直接传入一个数组对象,使得比call更方便一些

dog.speak.apply(cat,['喵喵喵']);
// i'm cat, i can 喵喵喵

 

3.bind

        相比call和apply,bind的兼容性要差一些。不过最大的不同点是,bind返回的是一个函数,可以赋给一个对象,以便于之后调用,而不是直接执行函数。如果要直接生效需要再加一对括号才行。

    var cat = {name:'cat'};var dog = {
        name : 'dog',
        speak : function(){
            setTimeout(function(value){
                alert("i'm " + this.name + ", i can " + value )
            }.bind(cat,'meow'),1000)
        }
    }
    
    dog.speak();
// i'm cat, i can meow

  可以注意到的一点是,bind可以直接使用在一个函数后面,比起前两位要把要用的对象再写一次要方便一些。

  

当bind不兼容时如何用call或apply封装一个bind?

function bind(fn,obj){
      return function() {
            return fn.apply(obj,arguments);
      }
}