[CPyUG] [OT]js闭包问题

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[CPyUG] [OT]js闭包问题

智障
如果
$(function() {
var i=0, elem;
while (i<xxx) {
elem = 创建元素;
$(elem).bind("xxxx", function() {
elem处理;})
}

那么,就会使所有的事件都只对最后一个元素进行处理。因为事件处理函数中的elem是在其定义作用域中有定义的。所谓闭包。

但是,如果我以其道反施其身,另外创建一个闭包,会如何?把事件处理代码改成:

(function(obj) {
$(obj).bind("xxxxx", function() {
obj处理;})
})(elem);

这时,事件处理函数的定义域是外层匿名函数。外层匿名函数的obj是每一次调运应该都是动态确定的,也就是说,应该能够达到目的。


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|

[CPyUG] Re: js闭包问题

CJ-19
是可以的。

如果你用的是jQuery的话,使用proxy方法更简单

$(elem).bind("xxxx",$.proxy(function () {
    //do something on elem
},elem))



On 1月1日, 上午2时54分, 智障 <[hidden email]> wrote:

> 如果
> $(function() {
> var i=0, elem;
> while (i<xxx) {
> elem = 创建元素;
> $(elem).bind("xxxx", function() {
> elem处理;})
>
> }
>
> 那么,就会使所有的事件都只对最后一个元素进行处理。因为事件处理函数中的elem是在其定义作用域中有定义的。所谓闭包。
>
> 但是,如果我以其道反施其身,另外创建一个闭包,会如何?把事件处理代码改成:
>
> (function(obj) {
> $(obj).bind("xxxxx", function() {
> obj处理;})
>
> })(elem);
>
> 这时,事件处理函数的定义域是外层匿名函数。外层匿名函数的obj是每一次调运应该都是动态确定的,也就是说,应该能够达到目的。

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html