🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、概述 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文context而存在的,换句话说,就是为了改变函数体内部 this 的指向; JavaScript 的一大特点是,函数存在 定义时上下文 和 运行时上下文以及上下文是可以改变的这样的概念; ## 二、例子 ``` function Dog(name){ this.name = name; } Dog.prototype.say = function(message){ console.log(this.name + ' say '+ message); } let dog = new Dog('小黄'); dog.say('汪汪'); //小黄 say 汪汪 ``` 但是我们也有一个Cat方法,也需要Dog方法中的say方法,如果像上面Dog方法一样再写一遍的话真的是太浪费时间,就要使用Call或者Apply方法来使我们的Cat方法来继承Dog方法; ``` function Cat(name){ this.name = name; } let cat = new Cat('小喵'); //call dog.say.call(cat, '喵喵'); //小喵 say 喵喵 //apply dog.say.apply(cat, ['喵喵']); //小喵 say 喵喵 ``` 这样的话,Cat方法就继承了Dog方法中的say方法,这样我们就不用在Cat方法中再去写一遍Say方法; >[danger] 可以看出 call 和 apply 是为了动态改变 this 而出现的,当一个对象中没有某个方法,但是其他的对象有这个方法,我们可以借助call或apply用其它对象的方法来操作。 ## 三、call和apply的区别 虽然call和apply的作用一样,都是动态的改变this的指向,但使用时两者还是有一定的区别,这个主要体现在传参方式上: ``` function fun(arg1, arg2, ...){ // Your code ... } fun.call(this, arg1, arg2, ...) fun.apply(this, [arg1, arg2, ...]) ``` 在call方法中,是把参数放进去依次传递,参数可以有多个;在apply方法中,是把参数放在一个数组中传递,所以参数只有两个; 所以当你不知道参数数量时,就使用apply方法,先把参数push进一个数组里,然后再进行传递,当知道参数数量时,用call和apply都可以;