java中call和apply_JavaScript中call()和apply()使用方法详解

概要

一.官方定义

在JavaScript中对于call()以及apply()的定义为:调用一个对象的一个方法,以另一个对象替换当前对象。

二.个人理解(配合demo)

从官方定义中我们可以看到什么(以apply()为例):

1.用来调用一个对象

2.用调用的对象来替换当前对象

熟悉面向对象编程的同学应该对this关键字特别熟悉,对于Java来说,this就是指当前对象。在JavaScript中,默认情况下(没有新的实例对象被new出来的时候),我们的this指向的是我们的Window对象(注:Window对象是由JavaScript引擎在解析页面的时候帮助我们创建的一个全局性的对象),当你将Window理解为JavaScript引擎为我们实例化出来的一个全局对象的时候,this指向Window就可以理解了。

看下面代码:

var name='banyoukang';

var globalFunc = function(){

console.info(this.name); //banyoukang

};

globalFunc ();

这段代码如此简单,很明显会输出‘banyoukang’,为什么呢?

我们对这段代码进行一下改进(会涉及到JavaScript作用域以及作用域链的内容):

var name='banyoukang';

var globalFunc = function(){

console.info(this); //globalFunc {}

var name = 'laowang';

console.info(this.name); //undefined

console.info(name); // laowang

};

var global1 = new globalFunc();

这里是列表文本由于我们是new了一个globalFunc函数的对象,所以this执行这个当前对象 globalFunc {}

2.虽然我这里定义了一个name叫‘laowang’,但是,各位看官请注意,这里的老王只是该对象的一个成员变量,并不是该对象的一个属性。(注:如果想为globalFunc ()赋一个name属性,应该是this.name='loawang')

3.这里就证明了2的论断,当你直接输出name的时候等于访问成员变量name,输出'laowang'

现在我们来看看apply()方法有什么用:

请看下面代码:

function globalFunc(name){

console.info(this.name);

console.info(name);

};

function localFunc(){

this.name = 'local';

console.info(this.name);

};

var local1 = new localFunc(); //local

var global1 = new globalFunc();

// undefined

//undefined

globalFunc.apply(local1,['banyoukang']);

//local

//banyoukang

1.第一个在new localFunc()过程中输出local,没有疑问

2.第二个由于没有name属性,参数name也没有值,所以输出两个underfined

3.第三个是重点,也是apply的精髓所在。

apply方法将第一个参数的作用域(也就是this)赋给执行apply方法的函数,即:将global中的this换成了local1中的this,当console.info(this.name)的时候,this为 localFunc(),其 this.name = 'local',故输出local。

apply方法(和call一样)的第一个参数是想要绑定的作用域(理解为this),第二个对象为一个参数数组, 就是 function globalFunc(name){} 方法中需要传入的参数,看下面代码:

function globalFunc(name,age){

console.info(this.name);

console.info(name+'今年'+age+'岁');

};

function localFunc(){

this.name = 'local';

console.info(this.name);

};

var local1 = new localFunc(); //local

globalFunc.apply(local1,['banyoukang','23']);

//local

//banyoukang今年23岁

看懂了吧,就是一个对象数组。

三.两个方法的区别和联系

对于call()和apply()方法,最大的区别就是apply(this,array[])第二个参数传的是一个数组,而call(this,argument),第二个参数传的不是数组是单个对象。

还是上面代码,稍稍改动一下:

function globalFunc(name,age){

console.info(this.name);

console.info(name );

};

function localFunc(){

this.name = 'local';

console.info(this.name);

};

var local1 = new localFunc();

//local

globalFunc.call(local1,'banyouakng');

//local

//banyoukang

看懂了吗,他们两的作用完全一样,唯一不同的就是一个参数传数组(apply()),一个传参数对象(call())。

四.总结

JavaScript中call以及apply()方法的主要用处在于动态替换this,在原型扩展和自定义框架中用的较多。

使用call()以及apply()主要在于理解this的概念,这里的this和Java等纯面向对象的语言是有很大区别的,理解了this,这两个方法的理解也就没有什么难度了。

顺便吐槽一下:开源中国这个编辑器真难用,样式我表示根本看不懂啊!管理员哪里走!吼吼吼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值