概要
一.官方定义
在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,这两个方法的理解也就没有什么难度了。
顺便吐槽一下:开源中国这个编辑器真难用,样式我表示根本看不懂啊!管理员哪里走!吼吼吼