《我们理解的call apply bind》

113 阅读2分钟

this

this是 JavaScript 语言的一个关键字。

它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。 在函数调用时默认的实例对象是window,而如果有指定对象来调用函数,那么函数中的this一般来说就是指向当前对象。

要明白这三个函数的存在意义是什么?答案是改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向

我们就可以使用call、apply和bind等方法来实现

call

  • 语法: fn.call([this],[x],[xx]...)

call函数主要接受2种参数,第一是this指向的转移对象,如果不传参数,或者第一个参数是null或nudefined,this都指向window,默认调用全局对象。

接下来的参数则是函数可能会遇到的可选参数。

<script>
    const A = {
         name : 'apple',
         showName: function(param){
            console.log(this.name,param)
         }
    }
    let pear = {name: 'pear'};
    A.showName.call(pear,'ppp')  //pear ppp
</script>

apply

fn.apply([this],['x','xx',...])

apply的用法其实和call基本没啥区别,主要的区别在于对参数的传递,call和apply的第一个参数都是要改变上下文的对象,而call从第二个参数开始以参数列表的形式展现,apply则是把除了改变上下文、对象的参数放在一个数组里面作为它的第二个参数。

<script>
    const A = {
         name : 'apple',
         showName: function(param1,param2,param3){
            console.log(this.name,param1,param2,param3)
         }
    }
    let pear = {name: 'pear'};
    A.showName.apply(pear,['ppp','kkk','sss']); //pear ppp kkk sss
</script>

apply()的参数为空时,默认调用全局对象

绑定bind

bind相比于call而言,并不是马上调用函数和直接改变函数的上下文,而是返回改变上下文之后的函数。 区别在于立即执行还是等待执行,

<script>
    const A = {
         name : 'apple',
         showName: function(param1){
            console.log(this.name,param1)
         }
    }
    let pear = {name: 'pear'}
    const method = A.showName.bind(pear,'aa');
    //method();
</script>

我们可以从控制台中看到,虽然使用了bind方法,但是实际上方法并没有马上执行,当我们把method()方法前的注释去掉后,我们就可以看到方法正式被调用了。

也就是说,bind相比于其他两个方法来说,主要的区别在于执行的时机不同,bind相当于是重新生成了一个方法,且该方法只有在真正被调用的时候才会被执行,执行bind方法本身并不会触发方法调用

参考[call、apply、bind的用法和区别 - 简书 (jianshu.com)]