call勤庐、apply和bind是Function對(duì)象自帶的三個(gè)方法,都是為了改變函數(shù)體內(nèi)部 this 的指向好港。
apply 愉镰、 call 、bind 三者第一個(gè)參數(shù)都是 this 要指向的對(duì)象钧汹,也就是想指定的上下文丈探;
apply 、 call 崭孤、bind 三者都可以利用后續(xù)參數(shù)傳參类嗤;
bind 是返回對(duì)應(yīng) 函數(shù)糊肠,便于稍后調(diào)用;apply 遗锣、call 則是立即調(diào)用 货裹。
function fruits() {}
fruits.prototype = {
color: 'red',
say: function() {
console.log(this.color);
}
};
var apple = new fruits();
apple.say(); // red, 此時(shí)方法里面的this 指的是fruits
banana = {color: 'yellow'};
apple.say.call(banana); //yellow,此時(shí)的this的指向已經(jīng)通過(guò)call()方法改變了,指向的是banana精偿,this.color就是banana.color='yellow';
apple.say.apply(banana);//yellow,同理弧圆,此時(shí)的this的指向已經(jīng)通過(guò)apply()方法改變了,指向的是banana笔咽,this.color就是banana.color ='yellow';
apple.say.apply(null); //undefined, null是window下的搔预,此時(shí),this 就指向了window 叶组,但是window下并沒(méi)有clolr這個(gè)屬性拯田,因此this.clolr就是window.color=undefined;
call 傳入?yún)?shù)列表
apply 傳入數(shù)組
var array1 = [12,'foo'];
var array2 = ['Doe',100];
Array.prototype.push.call(array1, 'Doe',100)
Array.prototype.push.apply(array1, array2)
bind() 方法會(huì)創(chuàng)建一個(gè) 新函數(shù),當(dāng)調(diào)用這個(gè)新函數(shù)時(shí)甩十,新函數(shù)會(huì)以創(chuàng)建它時(shí)傳入 bind() 方法的第一個(gè)參數(shù) 作為 this船庇,傳入 bind() 方法的 第二個(gè)以及以后的參數(shù)加上綁定函數(shù)運(yùn)行時(shí)本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來(lái)調(diào)用原函數(shù)。
var bar = function(){
console.log(this.x);
};
var foo = {
x:3
};
bar(); // undefined
var func = bar.bind(foo);
func(); // 3