JavaScript中的this关键字

在JavaScript中,this通常绑定到函数被调用的对象上,这种默认绑定在多数情况下是正常的,但是在某些情况下,this的这种绑定会丢失,比如,将函数作为参数传递给另外一个函数,这种默认的绑定就丢失了,例如:

var myObj = {
   name: 'A nice demo!',
   fx: function() {
      alert(this.name);
   }
};

function runFx(fx) {
   fx();
}

window.name = 'I am a nice window';

myObj.fx();  // 在这里,将会提示 A nice demo!

runFx(myObj.fx); // 在这里,得到的提示将会是 I am a nice window

为什么会出现这种情况呢?因为在第二次调用中,myObj.fx作为参数传递给了runFx,在函数runFx中执行时fx丢失了对myObj的默认绑定,而绑定到了runFx的默认绑定window上,所以第二次调用时得到的提示为I am a nice window,而这个往往不是我们需要的结果。

在Ajax横行的今天,要编写复杂的客户端组件,不可避免的要将函数名作为参数传递,Prototype注意到了这个问题,MS ASP.Net Ajax也注意到了这个问题,不知道你注意了没有?

Prototype提供的解决方案是bind方法,在Prototype的官方文档给出的描述是:Provides aguaranteed-binding equivalent of the original function, possibly with pre-filled arguments. 上面的例子如果使用Prototype的话,可以修改如下:

var myObj = {
   name: 'A nice demo!',
   fx: function() {
      alert(this.name);
   }
};

function runFx(fx) {
   fx();
}

window.name = 'I am a nice window';

myObj.fx();  // 在这里,将会提示 A nice demo!

var fx2 = myObj.fx.bind(myObj) // 先做一个绑定,
runFx(fx2); // 在这里,得到的提示将会是 A nide demo !这个往往是我们需要的结果

MS Ajax提供的解决方案是Function.createDelegate函数,createDelegate方法是个静态方法,可以直接调用。如果使用MS Ajax库的话,可以将上面的例子修改为:

var myObj = {
   name: 'A nice demo!',
   fx: function() {
      alert(this.name);
   }
};

function runFx(fx) {
   fx();
}

window.name = 'I am a nice window';

myObj.fx();  // 在这里,将会提示 A nice demo!

var fx2 = Function.createDelegate(myObj, myObj.fx) // 按照微软的说法,先做一个委托,
runFx(fx2); // 在这里,得到的提示将会是 A nide demo !这个往往是我们需要的结果

这看起来只是一个小问题,但是如果不注意的话却会造成很大的问题。引用Prototype中的原话:As discussed on the general Function page,binding can be a pretty tricky thing sometimes.

posted on 2007-03-12 23:53 Beginor 阅读(1221) 评论(16)  编辑 收藏 所属分类: Others

评论

#1楼  2007-04-08 16:09 raid数据恢复 [未注册用户]

不错呀   回复  引用    

#2楼  2007-04-08 16:09 硬盘数据恢复 [未注册用户]

收藏先   回复  引用    

#3楼  2007-04-08 16:09 上海数据恢复 [未注册用户]

好久没来站长这里了   回复  引用    

#4楼  2007-04-08 16:10 数据库修复 [未注册用户]

帮你多留点帖子,看起来很有人气 。呵呵   回复  引用    

#5楼  2007-04-08 16:10 数据恢复 [未注册用户]

要走了。   回复  引用    

#6楼  2007-04-08 16:11 数据恢复 [未注册用户]

hoho   回复  引用    

#7楼  2007-04-08 16:12 数据恢复 [未注册用户]

下个月再过来看看那   回复  引用    

#8楼  2007-09-25 15:50 fhvsbgmy [未注册用户]

那个说下月过来看看的来了没有?   回复  引用    

#9楼  2007-11-11 16:44 hwangsir [未注册用户]

原來createDelegate是這個作用!謝謝!!   回复  引用    

#10楼  2007-11-11 17:01 hwangsir [未注册用户]

再請教:
請問ms-silverlight的javascipt中的silverlight.createDelegate和您說的Function.createDelegate是一樣的意思嗎?


  回复  引用    

#11楼  2008-03-20 19:21 广州数据恢复 [未注册用户]

留意中   回复  引用    

#12楼  2008-03-20 19:21 硬盘数据恢复 [未注册用户]

不错啊   回复  引用    

#13楼  2008-03-20 19:22 硬盘恢复 [未注册用户]

支持   回复  引用    

#14楼  2008-04-15 11:24 stl [未注册用户]

很好的帖子,先谢谢
再拜读 o(∩_∩)o   回复  引用    

#15楼  2008-06-01 19:29 porno [未注册用户]

tahnx man   回复  引用    

#16楼  2008-06-14 21:05 seks [未注册用户]

thanx man   回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 

导航

公告

Google 网上论坛
WorldWind开发
访问此论坛

与我联系

搜索

 

常用链接

留言簿(1)

随笔分类(51)

随笔档案(36)

相册

最新随笔