繁体   English   中英

在JavaScript中循环创建闭包

[英]Creating closures in a loop in JavaScript

我有这种情况:

<html>
<head>
<script type="text/javascript" src="jquery-1.4.4.js"></script>
<script type="text/javascript">
var actions = {
    'view' : function(){alert("view");},
    'history': function(){alert("history");},
    'renewal': function(){alert("renewal");}
}
for(var action in actions){
    $('.' + action).live('click', function(e){
        e.preventDefault();
        if(actions[action])
            actions[action]();
    });
}
</script>
</head>
<body>
    <a class="view" href="#">view</a>
    <a class="history" href="#">history</a>
    <a class="renewal" href="#">renewal</a>
</body>
</html>

我认为创建了一个闭包,因为点击链接总是提醒“续订”,我无法修复它。

为什么不尝试在click事件中使用classname?

我不是jQuery专家,但是这样的话:

$('.' + action).live('click', function(e)
{
 e.preventDefault();
 if(actions[this.className])
   actions[this.className]();
});

这的确是。 你可以替换

for(var action in actions){
    $('.' + action).live('click', function(e){
        e.preventDefault();
        if(actions[action])
            actions[action]();
    });
}

for(var action in actions){
    $('.' + action).live('click', function(e){
        e.preventDefault();
        var currentAction = $(e.target).attr('class');
        if(actions[currentAction])
            actions[currentAction]();
    });
}

顺便说一句,问题不在于是否存在关闭。 实际上,如果没有闭包,变量action的值根本就不会被记住! 问题是循环中的所有函数都引用相同的变量action ,在循环结束时它将具有值renewal

有更好的方法可以做到这一点,但要使解决方案有效:

for(var action in actions){
    (function(myAction){
        $('.' + myAction).live('click', function(e){
            e.preventDefault();
            if(actions[myAction])
                actions[myAction]();
        });
    })(action);
}

您将发现实时不会取消默认操作,您将要使用委托

这不是发生的事情。 相反,您的事件处理函数引用了action变量,该变量将始终具有值“renewal”,因为这是循环完成后列表中的最后一项。 最好的方法是用这样的东西替换循环:

for(var action in actions) {
    $('.' + action).live('click', function(e){
        e.preventDefault();
        var action = $(e.currentTarget).attr('class');
        if(actions[action]) actions[action]();
   });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM