空间访问权限:游客, 头像访问权限:自己
[登录]后可以浏览更多信息
博客正文
【操作】
Javascript的apply,call

ref:
1、http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html
2、http://www.cnblogs.com/snandy/archive/2011/03/05/1971581.html

本人消化后的文章:

区分apply,call就一句话,
  foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3)


call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法作用完全一样,只是使用时传递的参数方式不同.虽然call,apply可以纯粹的用来调用/执行函数,但它们更多是用来改变函数执行的上下文。

示例代码:

function A(){
 this.message = "A.message初始值";  
 this.getMessage = function(){     
  return this.message;
 }
 this.show=function(){
  //空方法
 }
}

function B(){
 this.message = "B.message初始值";
 this.setMessage = function(msg){
  this.message = msg;
  alert(this.show);
 }
 this.showMessage=function(){
  alert(this.message);
 }
}
我们定义了A、B两个类,他们拥有共同属性message,各有两个不重复的方法。
1、直接调用类的方法
var a = new A();
alert(a.getMessage());

a1.jpg

2、修改B的message属性再调用showMessage方法
var b = new B();
b.setMessage('b.message的值改变');
b.showMessage();

a2.jpg
a3.jpg

由于B.show方法并不存在,所以显示为undefined,前面两段代码多少还在意料中,对吧


3、魔术开始了,看看如下的代码,执行结果是不是匪夷所思
b.setMessage.call(a, "执行b.setMessage,但本次setMessage里所有涉及到的this都是的操作都是指向a的");
alert(a.getMessage());

a4.jpg
a5.jpg


解释:b.setMessage.call第一个参数为指向a,改变了setMessage执行的上下文,这样setMessage函数内的所有this都指向了a,即所有和this相关的操作,修改的都是是a的属性,调用的是a的方法。

4、进一步验证
a.message='a.message的值改变';
b.showMessage.call(a);
b.showMessage();

a6.jpg
a7.jpg

怎么样,符合你的推断吗


 

栏目划分
WEB应用程序 (29)
桌面应用程序 (9)
Windows操作系统 (12)
xNix操作系统 (5)
数据库技术 (3)
多媒体技术 (1)
硬件技术 (4)
办公软件 (2)
以史为鉴 (2)
教学反思1 (1)
奇闻趣事 (5)
其它 (11)
教学反思 (3)
电子技术 (2)
中学生科技 (3)
 
主人推荐
音象定位和音箱喇叭的排步
我国高层意向已定:制造大飞机
“运十”悲剧
日尔曼人
细说百越族
宇宙深处的秘密——星云
[强烈推荐]中华56民族FLASH完整珍藏版
一组漂亮的植物
  
怀化市| 礼泉县| 响水县| 西吉县| 新乡市| 都兰县| 无为县| 治多县| 平泉县| 宿州市| 彭州市| 古浪县| 方正县| 岳西县| 广丰县| 宝丰县| 胶州市| 凌源市| 兰坪| 富民县| 灵山县| 景德镇市| 阿坝县| 赤水市| 沁阳市| 通化市| 秦安县| 佛冈县| 黑龙江省| 彰化市| 肥城市| 旬邑县| 宁安市| 新化县| 乌鲁木齐县| 莲花县| 当雄县| 大同市| 商河县| 梧州市| 新化县| http:// http:// http:// http:// http:// http://