日期:2014-05-16  浏览次数:20364 次

JS: call和apply 区别

JS: call和apply 区别

?

JS在线测试?http://runjs.cn/

?

call 方法: ?
语法:call([thisObj[,arg1[, arg2[,?? [,.argN]]]]])?
定义:调用一个对象的一个方法,以另一个对象替换当前对象。?
说明:?
call?
方法可以用来代替另一个对象调用一个方法。call? 方法可将一个函数的对象上下文从初始的上下文改变为由?thisObj? 指定的新对象。?
如果没有提供?thisObj? 参数,那么?Global? 对象被用作?thisObj 。?

apply
方法: ?
语法:apply([thisObj[,argArray]])?
定义:应用某一对象的一个方法,用另一个对象替换当前对象。?
说明:?
如果?argArray? 不是一个有效的数组或者不是?arguments? 对象,那么将导致一个?TypeError?
如果没有提供?argArray??thisObj? 任何一个参数,那么?Global? 对象将被用作?thisObj , 并且无法被传递任何参数。?

?

1)无疑关于call,最简单的解释就是:把隐藏的第一个参数显示化。因为通常一个函数(Function)的调用,会有一个额外的隐藏参数,就是函数(Function)所属的对象(如果没有所特指,则为global(如window)对象),在函数内你可用this关键字访问之。

从call的构造式 -- call(thisArg[,arg1,arg2…] ]);可看出

call(apply)方法可将一个函数的对象上下文(Function Context)从初始的上下文改变为由 thisObj 指定的新对象,这就是利用call(apply)的最大优势。说到此,我们不妨提提所谓的Function Context到底是为何物。先看看下面FunctionContextDemo:vvar changed={ item:"banana", act: "eating" };

var original={

        item: "chair",

 act: "sitting in",

 ask: function(){

  return "who's been "+this.act+" my "+this.item;

 }

};

alert("Original : " + original.ask());

alert("Not so simple,that have been changed to: " + original.ask.call(changed));

?解析上述代码:

?

最初存在2个对象changed和original,changed即就是一个数组,分别有item和act属性,而original除了具有和changed一样的item和act属性,还具有一个ask函数(询问到底是谁坐在椅子上),故当调用original.ask()时,可以看到意料中的结果:who's been sitting in my chair.而仔细往下看,当我们调用original.ask.call(changed)时,你觉得会出现什么的结果呢?在此,是利用了call把original的方法(函数)ask给与changed对象来执行,原来changed是没有ask方法(函数),如此绑定之后,函数的对象上下文(Function Context)即就是changed对象,故在方法(函数)ask里所调用的this就应该是changed对象,则可推知original.ask.call(changed)的结应该是:who's been eating my banana.

通过FunctionContextdemo例子可看出如果我们需要在编程过程中需要替换函数的对象上下文(Function Context),call就是不错的选择。

你可以试着把FunctionContextdemo例子修改如下,再看看是什么结果:

?

var changed={ item:"banana", act: "eating" };

var original={item: "chair",act: "sitting in"};

function ask(){

   return "who's been "+this.act+" my "+this.item;

}

alert("Original : " + ask.call(original));

alert("changed: " + ask.call(changed));

?

?2)javascript如何利用call来模拟面向对象中的继承的,而且可以实现多重继承