首页 新闻 会员 周边 捐助

*******************js闭包问题求解决******************

0
[已解决问题] 解决于 2012-05-03 14:29

这块,用firebug查看了下,产生了闭包,一直存在堆栈上不释放,导致卸载了mousemove,mouseup后,又移动的话会触发进入产生的这个闭包事件,该如何解决呢?

addEvent:function(oTarget,name,funName){
var args = Array.prototype.slice.call(arguments).slice(3);
var regHandler=funName
if(args.length>0){
regHandler
=function(e){
return funName.apply(this,[e||window.event].concat(args));
}
//这里的regHandler产生了个闭包,一直在堆栈中存在,该怎么解决呢?
}
if(oTarget.addEventListener){
oTarget.addEventListener(name,regHandler,
false);
}
else{
oTarget.attachEvent(
"on"+name,regHandler);
}
},
蓝丶 sky的主页 蓝丶 sky | 初学一级 | 园豆:6
提问于:2011-07-09 15:36
< >
分享
最佳答案
0

楼主是想让handler能够带上addEvent的第4到n位参数执行对吧?稍微修改了下

 1 var a = {
2 log: function () {
3 console.log(this);
4 console.log(arguments);
5 console.log(event);
6 },
7 addEvent: function(oTarget,name,funName){
8 var args = Array.prototype.slice.call(arguments).slice(3);
9
10 if(oTarget.addEventListener){
11 oTarget.addEventListener(name,bind(funName, args),false);
12 }
13 else{
14 oTarget.attachEvent("on"+name,bind(funName, args));
15 }
16 }
17 };
18
19 // 这里的bind是关键
20 function bind(fn, args, context) {
21 return function () {
22 fn.apply(context || this, args);
23 }
24 }
25
26 a.addEvent(document.getElementById('btn'), 'mouseup', a.log);
奖励园豆:5
BetaRabbit | 菜鸟二级 |园豆:267 | 2012-02-01 17:26
其他回答(1)
0

可以不用閉包

simonleung | 园豆:211 (菜鸟二级) | 2011-07-09 23:23
那该怎么做?主要是添加事件要把参数传过去!
支持(0) 反对(0) 蓝丶 sky | 园豆:6 (初学一级) | 2011-07-10 00:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册