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要想传递参数,需要传递一个数组。传递多个参数也是如此,这里就不再举例子了。 

posted @ 2018-03-26 20:07  小智是小白  阅读(95)  评论(0)    收藏  举报