js---call、apply和bind的区别

一、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的指向,区别是返回值为函数,想要立马执行函数,加上()。

猜你喜欢

转载自blog.csdn.net/weixin_43452154/article/details/129689955
今日推荐