您的位置:首页 > 移动开发

call和apply的用法和区别

2017-12-11 13:21 211 查看
先用通俗易懂的语言让我们知道他的用法,再去以专业的角度去正确理解这个知识点!!!

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

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

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

    最原始的例子:

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

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

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

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

    call:

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

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

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

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

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

通俗易懂示例:

a.

function add(a,b)  

{  

    alert(a+b);  

}  

function sub(a,b)  

{  

    alert(a-b);  

}  

  

add.call(sub,3,1);   
其中add.call(sub,3,1);用add来代替sub执行后面的参数;所以结果就是 执行add这个函数,所以结果就是 alert(4);

b.

function Animal(){    

    this.name = "Animal";    

    this.showName = function(){    

        alert(this.name);    

    }    

}    

  

function Cat(){    

    this.name = "Cat";    

}    

   

var animal = new Animal();    

var cat = new Cat(); 

animal.showName.call(cat,","); 

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

c.实现继承

function Animal(name){      

    this.name = name;      

    this.showName = function(){      

        alert(this.name);      

    }      

}      

    

function Cat(name){    

    Animal.call(this, name);    

}      

    

var cat = new Cat("Black Cat");     

cat.showName();
使用animal对象代替this对象,所以cat就继承了animal中的所有方法。所以animal中的所有方法cat中都可以使用;

d.多重继承

function Class10()  

{  

    this.showSub = function(a,b)  

    {  

        alert(a-b);  

    }  

}  

  

function Class11()  

{  

    this.showAdd = function(a,b)  

    {  

        alert(a+b);  

    }  

}  

  

function Class2()  

{  

    Class10.call(this);  

    Class11.call(this);  

}  
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属性
但是类数组却不能通过[code]forEach
进行遍历,因为
forEach
是数组原型链上的方法,类数组毕竟不是数组,所以无法使用! [/code]
如果你看到了这里就有必要了解一下 关于call和apply这个知识点 有一个专业词是:“执行上下文”
所谓的执行上下文也就是指我们平时在函数中用到的this的执行环境,而call和apply的本质:
其实就是改变this的执行环境,而不是前面所说的谁把谁的方法给了谁(前面是为了方便理解);
说到这里有的人会问 什么时候用call,什么时候用apply呢?

首先我们知道 函数有个最重要的内容就是参数---》
那么每个函数都有参数吗? 每个函数的参数都是一个吗? 每个函数的参数都是变量吗?

所以当没有参数或者只有一个参数的时候我们就用call!   	当要传入多个参数的时候就用apply!

或者:当你传入的参数就是一个数组或者类数组就直接用apply!   如果你的参数需要逐条加入就用call!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息