日期:2014-05-16 浏览次数:20364 次
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来模拟面向对象中的继承的,而且可以实现多重继承