簡體   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