js中call apply bind 的使用

先说结论再看代码:

相同点:call,apply和bind都可以用来改变this的指向,他们的第一个参数都是 this 要指向的对象

call和apply的区别:传参形式不一样,call的参数都是要逗号隔开一个一个传,apply除了第一个参数是this的指向对象,其余的参数都要以数组的形式传输;

call和bind的区别:bind是返回了指向这个对象的函数,需要再次执行,其余和call一样。

var name = "貂蝉"
var age = 18
var obj = {
    name: '妲己',
    objAge: this.age,
    showInfo: function (f, t) {
        console.log(this.name + ' 年龄 ' + this.age + " 来自 " + f + " ,去往 " + t)
    }
}

obj.showInfo('三国', '王者峡谷') // obj对象没有age参数,所以执行结果是 妲己 年龄 undefined 来自 三国 ,去往 王者峡谷
var obj2 = {
    name: '凯爹',
    age: '20'
}
var obj3 = {
    name: '吕布',
    age: '21'
}
var obj4 = {
    name: '金蝉',
    age: '22'
}

obj.showInfo.call(obj2, '遥远的西方', '王者峡谷');
obj.showInfo.call(obj2, ['遥远的西方', '王者峡谷']); // 传数组会被作为一个参数
obj.showInfo.apply(obj3, ['三国', '王者峡谷']); // 如果这样传会报错 obj.showInfo.apply(obj3, '三国', '王者峡谷');
(function () { obj.showInfo.apply(obj3, arguments) // 也可以这样传 })('三国', '王者荣耀峡谷');
obj.showInfo.bind(obj4, '东土大唐', '王者峡谷')(); // bind 返回的函数 所以最后又加了()
obj.showInfo.bind(obj4, ['东土大唐', '王者峡谷'])();

执行结果如下:

 

posted @ 2022-04-27 14:08  竹为君生  阅读(22)  评论(0)    收藏  举报