循环范围的Javascript采用最后一个变量

这有效:

var toggler = function(most){ var open = $('#toggle_' + most + ' .minus').is(':visible'); if(open){ $('#toggle_' + most + ' .minus').hide(); $('#toggle_' + most + ' .plus').show(); }else{ $('#toggle_' + most + ' .plus').hide(); $('#toggle_' + most + ' .minus').show(); } $('#' + most + ' ol.tlist').toggle(open); }; $('#toggle_mostviewed').click(function(){ toggler('mostviewed'); }); $('#toggle_mostshared').click(function(){ toggler('mostshared'); }); $('#toggle_mostrecent').click(function(){ toggler('mostrecent'); }); 

但这不是:

  var toggler = function(most){ var open = $('#toggle_' + most + ' .minus').is(':visible'); if(open){ $('#toggle_' + most + ' .minus').hide(); $('#toggle_' + most + ' .plus').show(); }else{ $('#toggle_' + most + ' .plus').hide(); $('#toggle_' + most + ' .minus').show(); } $('#' + most + ' ol.tlist').toggle(open); }; var t = ['mostviewed','mostshared','mostrecent']; for(var i = 0 ; i < t.length; i++ ){ var j = t[i]; $('#toggle_' + j).click(function(){ toggler(j) }); } 

就像for循环被“替换”了:

  $('#toggle_mostrecent').click(function(){ toggler('mostrecent'); }); 

即最后一次迭代是唯一重要的。

您的循环构造不正确。 如果要在循环中设置变量以访问数组或对象的元素,这是正确的语法:

 var test = []; for(var i = 0; i < test.length; test++) (function(index){ // do cool stuff with test[index] })(i); 

这会在变量i上创建一个闭包。 如果您不熟悉语法,请执行以下操作:

1)我们定义一个闭包(在for语句之后的开头())

2)我们定义一个匿名函数来获取index参数

3)我们将索引传递给闭包(即我们执行函数),最后一组是()。

这三个步骤发生在循环的每次迭代中。 如果不使用闭包来捕获索引值,那么当实际进行数组访问时,此示例中的索引将+1太多,并在运行时导致错误。

干杯

这是因为在循环中错误地使用了闭包变量

在这种情况下,因为您在迭代数组,您可以使用$ .each()

 var t = ['mostviewed','mostshared','mostrecent']; $.each(t, function(_,most){ $('#toggle_' + most).click(function(){ toggler(most) }); }) 

你说:

$('#toggle_' + most).click(function(){ toggler(most) });

但我认为这就是你的意思:

$('#toggle_' + j).click(function(){ toggler(j) });

(你定义了j但后来most常用)。

为什么不这样做:

 $('#toggle_mostviewed, #toggle_mostshared, #toggle_mostrecent').click(function({ toggler((this.id).split("_").pop()); }); 

或者甚至更好,给他们一个类“切换”(并在html中保留ID),然后:

 $('.toggle').click(function({ toggler((this.id).split("_").pop()); });