【巷子】:關於Apply、call、bind的詳解

 call方法:數組

語法:call(thisObj,'',''........)

定義:調用一個對象的一個方法,以另外一個對象替換當前對象

說明:call方法能夠用來代替另外一個對象調用一個方法。call方法可將一個函數的對象上下文初始的上下文改變爲由thisObj指定的新對象,若是沒有提供thisObj參數,那麼global對象被用作thisObj

apply方法:瀏覽器

語法:apply(thisObj,['','',''....])

定義:應用某一個對象的方法,用另外一個對象替換當前對象

若是argArray不是一個有效的數組或者不是arguments對象,那麼將致使一個TypeError.若是沒有提供argArray和thisObj任何一個參數,那麼Global對象將用作thisObj,而且沒法被傳遞任何參數

相同之處:app

1、都是用來改變函數的this對象的指向
2、第一個參數都是this要指向的對象
3、均可以利用後續參數傳參

不一樣之處:
一、call和apply都是對函數的直接調用,而bind方法返回的仍然是一個函數,所以後面須要加上()來進行調用才能夠

案例一:bind與call、apply的區別函數

var a={
     name:'阿姨請別把您閨女介紹給我',
     sex:'男',
     age:'24',
     say:function(){
          console.log(this.name+',今年'+this.age+'歲,性別'+this.sex)
     }
}

var b={
     name:'就要把閨女介紹給你',
     sex:'女',
     age:'18'
}
a.say();//阿姨請別把您閨女介紹給我,今年24歲了,性別男

那麼咱們想一下如何讓b用say的方法顯示數據呢?

用call方法:a.say.call(b)

用apply方法:a.say.apply(b)

用bind方法:a.say.bind(b)()

案例二:call與apply的區別this

var a={
     name:'阿姨請不要把您閨女介紹給我',
     sex:'男',
     age:'18',
     say:function(school,grade){
          console.log(this.name+'性別'+this.sex+'年齡'+this.age+school+grade)
     }
}

var b={
     name:'就喜歡把閨女介紹給你',
     sex:'女',
     age:'18'
}

如今咱們看say方法中多了兩個參數,咱們經過call和apply的參數進行傳參

用call方法:a.say.call(b,'清華','三年級')

用apply方法:a.say.apply(b,['清華','六年級'])

call後面的參數與say方法中是一一對應的,而apply第二個參數是一個數組

用bind方法:a.say.bind(b,'清華','三年級')
可是因爲bind返回的仍然是一個函數,因此咱們能夠在調用的時候在進行傳參
a.say.bind(b)('清華','三年級')
因爲IE6-IE8不支持該方法,因此若想在不一樣瀏覽器中使用因此咱們要作下處理
兼容處理bind方式
if(!Function.prototype.bind){
     Function.prototype.bind=function(obj){
          var This=this;
          var args=arguments;
          return function(){
               This.apply(obj,Array.prototype.slice.call(args,1))
          }
     }
}

注:還有一些不完善的部分,還會持續更新。顯湊活着看!加油大家都是最棒的。麼麼噠!!!  另外大神能夠指點不足之處spa

相關文章
相關標籤/搜索