call方法:
語法:call(thisObj,'',''........)
定義:調用一個對象的一個方法,以另一個對象替換當前對象
說明:call方法可以用來代替另一個對象調用一個方法。call方法可將一個函數的對象上下文初始的上下文改變為由thisObj指定的新對象,如果沒有提供thisObj參數,那么global對象被用做thisObj
apply方法:
語法:apply(thisObj,['','',''....])
定義:應用某一個對象的方法,用另一個對象替換當前對象
如果argArray不是一個有效的數組或者不是arguments對象,那么將導致一個TypeError.如果沒有提供argArray和thisObj任何一個參數,那么Global對象將用做thisObj,並且無法被傳遞任何參數
相同之處:
1、都是用來改變函數的this對象的指向 2、第一個參數都是this要指向的對象 3、都可以利用后續參數傳參 不同之處: 1、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的區別
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)) } } }
注:還有一些不完善的部分,還會持續更新。顯湊活着看!加油你們都是最棒的。么么噠!!! 另外大神可以指點不足之處