一、call、apply和bind的作用
相同点:
都是动态修改this指向;都不会修改原先函数的this指向。
异同点:
(1)执行方式不同:
call和apply是改变后页面加载之后就立即执行,是同步代码。
bind是异步代码,改变后不会立即执行;而是返回一个新的函数。
(2)传参方式不同:
call和bind传参是一个一个逐一传入,不能使用剩余参数的方式传参。
apply可以使用数组的方式传入的,只要是数组方式就可以使用剩余参数的方式传入。
二、call、apply和bind应用
call(参数1,参数1,参数3.....)
参数1:调用函数时,内部this的具有值剩余的参数(参数2,参数3...)就是函数的参数
apply(参数1,[参数值1,参数值2,参数值3])
参数1:调用函数时,内部this的具有值参数2:是一个数组,其中数组每一个值代表了函数的参数
****call和apply的参数是不同的,apply的第二个参数是数组
bind(参数1,参数2,参数3.....)
参数1:调用函数时,内部this的具有值剩余的参数(参数2,参数3...)就是函数的参数,返回的是函数
var x = 1;
var obj = {
x:2,
run:function(iteml,item2){
return this.x + item1 + item2;
},
};
var f = obj.run;
console.log( f.apply(obj,['好不好',听你的']) ) //2好不好听你的
console.log( f.call(obj,好不好',听你的') //2好不好听你的
console.log( f.bind(obj,好不好',听你的')()); //2好不好听你的
三、应用场景
1、求数组的最大值、最小值可以用apply
console.log( Math.max.apply(null,[3,6,8,99,55]) )
2、通过bind改变其指向h1s
<button id="btn">1111</button>
<h1 id="h1s">2222</h1>
var btn = document.getElementById('btn');
var h1s = document.getElementById('h1s');
btn.onclick = function () {
console.log(this.id);
}.bind(h1s);
等等.vue和react会用得比较多。
四、总结
1、call、apply和bind都是改变this的指向
2、call为同步代码,传参一一传入,第一个参数为this的指向。
apply为同步代码,只能传两个参数,第一个为this指向,第二个为数组。
bind为异步代码,传参一一传入,第一个参数为this的指向,区别是返回值为函数,想要立马执行函数,加上()。