關(guān)于call()
,apply()
,bind()
之前學(xué)習(xí)全靠死記硬背,當(dāng)然時(shí)間長不用就忘了,又得重新找博客學(xué)習(xí).造成這種學(xué)了忘,忘了再學(xué)的主要問題還是沒有理解.
先看看這三種方法的區(qū)別:
返回值不同:
call
,apply
返回函數(shù)執(zhí)行的結(jié)果;
bind
返回的是沒有執(zhí)行的函數(shù),需要手動(dòng)調(diào)用傳遞的參數(shù)不同:
apply
的參數(shù)要求是一個(gè)數(shù)組
call
的參數(shù)則是一個(gè)個(gè)元素
bind
的參數(shù)也是單個(gè)元素
網(wǎng)上很多文章解釋這些方法都是從改變this
的指向開始,這樣理解部分案例還是比較好理解的如果在this
漫天飛的情況下就很頭痛了,因?yàn)?code>this指向不變的情況下都沒弄明白指的誰,更何況變了的情況.比如:
fn.apply(this, arguments);
難道是這里的this指向發(fā)生了變化?這個(gè)問題我希望留到后面解答.
我們先看這樣一段代碼:
var mult = function () {
console.log('開始計(jì)算乘積');
var a = 1;
for (var i = 0, l = arguments.length; i < l; i++) {
a = a * arguments[i];
}
console.log(a);
};
var proxyMult = (function() {
var cache = {};
return function() {
console.log(this); //window
var args = Array.prototype.join.call(arguments, ',');
if(args in cache) {
return cache[args];
}
return cache[args] = mult.apply(this, arguments);
}
})();
proxyMult(1,2,3,4);
proxyMult(1,2,3,4);
這里用到了call
和apply
兩種方法,并且方法里面還有this
.我們先看call
這個(gè)方法
var args = Array.prototype.join.call(arguments, ',');
我們知道arguments
是個(gè)類數(shù)組對象,是沒法調(diào)用join
方法的,所以我們需要從數(shù)組中借用這個(gè)方法,于是就"打電話"(call)叫這個(gè)方法來幫個(gè)忙.
于是arguments
叫join
來幫忙,所以join
在arguments
的環(huán)境下執(zhí)行,這里我把第一個(gè)參數(shù)理解成執(zhí)行環(huán)境(誰調(diào)用了這個(gè)方法),而第二個(gè)參數(shù)便是要傳入借用函數(shù)的參數(shù),如果arguments
有join
方法的話,上面的那行代碼等價(jià)于
arguments.join(',');
我們再看下面一行代碼,
mult.apply(this, arguments);
這里我們需要得到mult
的執(zhí)行結(jié)果,不在乎是誰調(diào)用,所以直接在window
下執(zhí)行,而這里的this
由打印可知指的是window
.
那么this
指向發(fā)生改變作何理解呢?
我們再看一個(gè)案例
var personA = {
name: 'XL',
sayName: function (hobby){
console.log(this.name + ' likes ' + hobby);
}
};
personA.sayName('basketball'); // 'XL likes basketball'
var personB = {
name: 'xl'
}
personA.sayName.call(personB, 'basketball'); // 'xl likes basketball'
personA.sayName.apply(personB, ['basketball']); // 'xl likes basketball'
由上文我們知道personB從personA那里借到sayName
這個(gè)方法,而在sayName
方法中,this
原先指的是personA這個(gè)對象,但是真正調(diào)用sayName
方法的卻是personB,舉個(gè)例子:你從別人那里借了100元,你用這100元掙了200元,那么你還的時(shí)候難道將你掙得200元也還給被人?
用執(zhí)行環(huán)境來理解就是在當(dāng)前環(huán)境下執(zhí)行了某個(gè)方法,某個(gè)方法的this
便指向當(dāng)前的環(huán)境
以上是我的個(gè)人理解,歡迎指正