分享

JavaScript中call()、apply()、bind()的用法

 wenxuefeng360 2022-11-05 发布于四川

三个比较和用法介绍

call()、apply()、bind()三者目的都是用来改变this的指向,但用法有一些不同

call()
  • 语法:call(thisObj,arg1,arg2,...,argN)
  • 参数:thisObj:this要指向的对象,arg1,arg2,...,argN:参数列表,参数可以是任意类型,当thisObj为null、undefined的时候,默认指向window
  • 注意:会立即执行函数
apply()
  • 语法:apply(thisObj,[arg1,arg2,...,argN])
  • 参数:thisObj:this要指向的对象,[arg1,arg2,...,argN]:参数,这里为参数数组,这也是与call()的不同点,参数数组中可以是任意类型
  • 注意:会立即执行函数
bind()
  • 语法:bind(thisObj,arg1,arg2,...,argN)
  • 参数:thisObj:this要指向的对象,arg1,arg2,...,argN:参数列表,参数可以是任意类型,当thisObj为null、undefined的时候,默认指向window
  • 返回值:返回一个绑定新this的函数
  • 注意:bind()函数不会立即执行绑定this后的函数,而是将该函数返回,如果需要立即执行需要bind()()

通过实际例子对call()、apply()、bind()三者进行说明

1.先来看两个常规的例子,熟悉一下this指向
var name = '小王',age = 17;
var obj = {
    name:'小张',
    objAge:this.age,
    myFunc:function(){
        console.log(`${this.name} 年龄是:${this.age}`);
    }
}
console.log(obj.objAge);  //17   如果用let定义,不存在变量提升,则这里为undefined
obj.myFunc(); //小张 年龄是:undefined
var name = '小刚';
function show(){
    console.log(this.name);
} 
show();//小刚

第一个例子中调用myFunc(),这个里面的this是指向obj的,第二个例子中是全局声明的普通的函数,它里面的this是指向window的

2.我们利用call()、apply()和bind()在未传参的情况下来重定义this这个对象
var name = '小王',age = 17;
var obj = {
    name:'小张',
    age:this.age,
    myFunc:function(){
        console.log(`${this.name} 年龄是:${this.age}`);
    }
}

var db = {
    name:'小刚',
    age:20
}
obj.myFunc(); //小张 年龄是:17
obj.myFunc.call(db); //小刚 年龄是:20
obj.myFunc.apply(db);//小刚 年龄是:20
obj.myFunc.bind(db)();//小刚 年龄是:20

这个例子我们可以显而易见的看到,利用call()、apply()和bind()方法,将this指向了db这个对象

3.通过传参来比较call()、apply()和bind()三者的传参情况
var name = '小王',age = 17;
var obj = {
    name:'小张',
    age:this.age,
    myFunc:function(from,to){
        console.log(`${this.name} 年龄是:${this.age} 来自:${from} 去往:${to}`);
    }
}
var db = {
    name:'小刚',
    age:20
}
obj.myFunc();  //小张 年龄是:17 来自:undefined 去往:undefine
obj.myFunc.call(db,'北京','上海'); //小刚 年龄是:20 来自:北京 去往:上海
obj.myFunc.apply(db,['北京','上海']); //小刚 年龄是:20 来自:北京 去往:上海
obj.myFunc.bind(db,'北京','上海')(); //小刚 年龄是:20 来自:北京 去往:上海

乾坤未定,你我皆是黑马!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多