[英]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.