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:
如果哪位大神不小心看见我的博客 可以指点一下!!!
主要是看例子,帮助你用最短的时间学会去使用和做一个大概的理解
先了解为什么要用 和 用了有什么便利!
最原始的例子:
我有一辆保时捷跑车,平时有什么事情我会开着他出去,但是我弟弟今天要去见女朋友,你说他是再买一个呢还是用我的呢??
当然是用我的,一家人嘛!
从这个例子可以看出,弟弟为什么要用我的,因为他没有, 用了有什么好处?他不必再花钱去买。
在这个基础上再去看看实践,如下:
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!
相关文章推荐
- JavaScript中apply和call的用法区别
- 关于JavaScript中apply与call的用法意义及区别
- js的call() ,apply() 两种方法的区别和用法,最白话文的解释,让枯燥滚粗!
- 关于JavaScript中apply与call的用法意义及区别
- 关于JavaScript中apply与call的用法意义及区别(转)
- 关于JavaScript中.apply()用法和call()的区别(一)
- apply与call的用法及区别
- js中apply和call的用法和区别
- 关于JavaScript中apply与call的用法意义及区别(转)
- apply, call的用法与区别
- 关于JavaScript中apply与call的用法意义及区别
- 关于JavaScript中apply与call的用法意义及区别
- JS中apply和call的区别和用法
- call和apply的区别和用法
- JavaScript中apply与call的用法意义及区别说明
- 关于JavaScript中apply与call的用法意义及区别
- 关于JavaScript中apply与call的用法意义及区别
- 关于JavaScript中apply与call的用法意义及区别
- javascript(js)中函数apply和call的用法、区别、联系
- js中call和apply的用法和区别