call和apply的用法和区别

来源:互联网 发布:淘宝宝贝上架 编辑:程序博客网 时间:2024/05/16 06:30

先用通俗易懂的语言让我们知道他的用法,再去以专业的角度去正确理解这个知识点!!!


如果哪位大神不小心看见我的博客 可以指点一下!!!


主要是看例子,帮助你用最短的时间学会去使用和做一个大概的理解

  先了解为什么要用 和 用了有什么便利!

    最原始的例子:

我有一辆保时捷跑车,平时有什么事情我会开着他出去,但是我弟弟今天要去见女朋友,你说他是再买一个呢还是用我的呢??

当然是用我的,一家人嘛!

从这个例子可以看出,弟弟为什么要用我的,因为他没有,   用了有什么好处?他不必再花钱去买


在这个基础上再去看看实践,如下:

    call:

语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) ;

定义:调用一个对象的一个方法,以另一个对象替换当前对象;

说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 

apply: 
语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。


通俗易懂示例:

a.

  1. function add(a,b)  
  2. {  
  3.     alert(a+b);  
  4. }  
  5. function sub(a,b)  
  6. {  
  7.     alert(a-b);  
  8. }  
  9.   
  10. add.call(sub,3,1);   
其中add.call(sub,3,1);用add来代替sub执行后面的参数;所以结果就是 执行add这个函数,所以结果就是 alert(4);

b.

  1. function Animal(){    
  2.     this.name = "Animal";    
  3.     this.showName = function(){    
  4.         alert(this.name);    
  5.     }    
  6. }    
  7.   
  8. function Cat(){    
  9.     this.name = "Cat";    
  10. }    
  11.    
  12. var animal = new Animal();    
  13. var cat = new Cat(); 
  14. animal.showName.call(cat,","); 

animal.showName.call(cat,",");的意思是把animal中的showName方法放在cat中;也就是说cat之后也就有了animal中的showName方法;

c.实现继承

  1. function Animal(name){      
  2.     this.name = name;      
  3.     this.showName = function(){      
  4.         alert(this.name);      
  5.     }      
  6. }      
  7.     
  8. function Cat(name){    
  9.     Animal.call(this, name);    
  10. }      
  11.     
  12. var cat = new Cat("Black Cat");     
  13. cat.showName();
使用animal对象代替this对象,所以cat就继承了animal中的所有方法。所以animal中的所有方法cat中都可以使用;

d.多重继承

  1. function Class10()  
  2. {  
  3.     this.showSub = function(a,b)  
  4.     {  
  5.         alert(a-b);  
  6.     }  
  7. }  
  8.   
  9. function Class11()  
  10. {  
  11.     this.showAdd = function(a,b)  
  12.     {  
  13.         alert(a+b);  
  14.     }  
  15. }  
  16.   
  17. function Class2()  
  18. {  
  19.     Class10.call(this);  
  20.     Class11.call(this);  
  21. }  
calss2即继承了class10,也继承了class11这个方法,也就是 多重继承;

call和apply比较:

相同点:

都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行

不同点:

1.call可以有多个参数,并且从第二个参数开始可以是任意类型

2.apply只能有两个参数,而且第二个参数只能是一个数组或者类数组

简单说一下类数组的概念:

类数组根据字面意思来理解就是一种类似于数组的另一种类型

eg:

   var arrayLike = {    0: 'item1',    1: 'item2',    2: 'item3',    length: 3   }
 这样的数组类型就是类数组,他拥有数组的属性:
1.可以通过角标来获取          2.可以通过for循环进行遍历            3.具有length属性
但是类数组却不能通过forEach进行遍历,因为forEach是数组原型链上的方法,类数组毕竟不是数组,所以无法使用!
如果你看到了这里就有必要了解一下 关于call和apply这个知识点 有一个专业词是:“执行上下文”
所谓的执行上下文也就是指我们平时在函数中用到的this的执行环境,而call和apply的本质:其实就是改变this的执行环境,而不是前面所说的谁把谁的方法给了谁(前面是为了方便理解);
说到这里有的人会问 什么时候用call,什么时候用apply呢?首先我们知道 函数有个最重要的内容就是参数---》
那么每个函数都有参数吗? 每个函数的参数都是一个吗? 每个函数的参数都是变量吗?所以当没有参数或者只有一个参数的时候我们就用call!   当要传入多个参数的时候就用apply!或者:当你传入的参数就是一个数组或者类数组就直接用apply!   如果你的参数需要逐条加入就用call!

原创粉丝点击