call和apply笔记
1.call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。
2.借用知乎上一个回答:
猫吃鱼,狗吃肉,奥特曼打小怪兽。
有天狗想吃鱼了
猫.吃鱼.call(狗,鱼)
狗就吃到鱼了
猫成精了,想打怪兽
奥特曼.打小怪兽.call(猫,小怪兽)
如下面函数:
function mao(){
this.chiyu="吃鱼";
}
function gou(){
mao.call(this);
alert(this.chiyu);
}
gou();
上面的例子中“狗子”原本不会吃鱼,但是在“猫”的帮助下(call)下,“狗子”也学会吃鱼啦 哈哈!
继续拓展:
function mao(num) {
this.chiyu = "吃"+num+"鱼";
}
function gou() {
mao.call(this,5);
alert(this.chiyu);
}
gou(); //吃5条鱼
在上面的例子中,我们发现call是可以传递参数的,那可不可以传递两个甚至多个参数呢?
继续往下看:
function mao(num1,num2) {
this.chiyu = "吃"+num1+"鲤鱼和"+num2+"条草鱼";
}
function gou() {
mao.call(this,5,6);
alert(this.chiyu);
}
gou();
结果证明,可以传递多个参数。
那call 和 apply 有什么区别呢?
看apply第一个例子:
function mao() {
this.chiyu = "吃鱼";
}
function gou() {
mao.apply(this);
alert(this.chiyu);
}
gou(); //吃鱼
上面这个例子并没有传递参数,但是执行成功了,说明call和apply在没有参数的情况下是没有区别的。
接下来让apply传递一个参数
function mao(num) {
this.chiyu = "吃"+num+"条鱼";
}
function gou() {
mao.apply(this,[5]);
alert(this.chiyu);
}
gou();//吃5条鱼
可以发现,apply要想传递参数,需要传递一个数组。传递多个参数也是如此,这里就不再举例子了。

浙公网安备 33010602011771号