6

要想记得牢,首先要记住它存在的目的。
在javascript OPP中,我们经常这样定义:

function person(){}
person.prototype = {
    name: 'jack',
    say: function(){
        console.log('my name is' + this.name)
    }
}
var goodPerson = new person()
goodPerson.say() // 打印 my name is jack

现在有一个对象dog = {name:'wangwang'},这条狗也想会说话(拥有say方法),那么我们可以这样goodPerson.say.call(dog) 这样dog就可以说话了。

var dog = {
    name:'wangwang'
}
goodPerson.say.apply(dog) // my name is wangwang
或
goodPerson.say.call(dog) // my name is wangwang

可以看出call和apply是为了动态改变this而出现的,如果一个object没有某个方法,而别的object有,那么就用得上call和apply了。
那call 和 apply有什么区别呢?
请看下边这个例子:

function add (a = 1, b = 1) {
    return a + b
}
function sub (a = 1, b = 1) {
    return a - b
}
add() // 2
sub() // 0
add.call(sub, 2, 2) // 4
add.apply(sub,[2,2]) // 4
sub.call(add, 3, 2) // 1
sub.apply(add, [3, 2]) // 1

so,很容易就可以看出call和apply的区别就是传参数的方式不同。


huangsh
281 声望16 粉丝

灵魂和皮囊能够握手言和,面子和里子能够始终如一。