Javascript函数是在循环中使用最后已知的参数?

我有一种情况,我需要动态创建按钮,我需要将onclick事件附加到每个按钮。 以上所有都做得很好。 但是,当单击其中一个按钮时,调用的函数ie(animate(poly,map))使用poly的最后已知值和map作为参数。 从今天早上起我就遇到了这个问题。 请帮忙。 谢谢

for(var k=0;k<arr_altern.length;k++){ my_div=create_div_interchange(arr[i],1,78,visited_bus,interchange_arr,arr_altern[k],null, my_interchange_array); $('#results').append(my_div); var x='animate'; var v='#animater'; v+=div_id; x+=div_id; map=create_map(div_id); var poly=retrieve_results_edges(bus_stops_visited,map); var strVar=""; strVar += ""; strVar += ""; strVar += ""; $(v).append(strVar); document.getElementById(x).onclick=function test(){ animate(poly,map); } set_map(map); set_polyline_color(my_traversed_edge,map); } 

更新解决方案:

 i've replaced document.getElementById(x).onclick=function test(){ animate(poly,map); } 

通过

 $('#'+x).bind('click',{poly:poly,map:map}, function(event) { animate(event.data.poly,event.data.map) }); 

您在没有var关键字的情况下声明了map变量,因此它是在全局范围内创建的,因此只有一个map变量可以在每个循环中覆盖它的值。

 for(var k=0;k<\/span>'; $(v).append(strVar); document.getElementById(x).onclick=function test(){ animate(poly,map); } set_map(map); set_polyline_color(my_traversed_edge,map); })(k); } 

在IIFE(立即调用的函数表达式)中运行代码将为其中的代码创建新的范围。 这允许您在运行时声明变量,并且它们将在未来保留它们的值(例如,它们将可用于将来触发的事件处理程序)。 注意我在声明所有变量时使用了var关键字,因此它们是在当前范围内创建的。

更新

您还可以使用$.each()来设置代码范围:

 $.each(arr_altern, function (k, val) { my_div=create_div_interchange(arr[i],1,78,visited_bus,interchange_arr,arr_altern[k],null, my_interchange_array); $('#results').append(my_div); var x = 'animate' + div_id, v = '#animater' + div_id, map = create_map(div_id), poly = retrieve_results_edges(bus_stops_visited, map), strVar = '<\/span>'; $(v).append(strVar); document.getElementById(x).onclick=function test(){ animate(poly,map); } set_map(map); set_polyline_color(my_traversed_edge,map); }); 

尝试使用自我调用

 (function (x, poly, map) { document.getElementById(x).onclick=function test(){ animate(poly,map); } })(x, poly, map); 

您可以使用jQuery代理

 var buttons = $("a"); for (var i = 0; i < buttons.length; i++){ $(buttons[i]).unbind("click").click( $.proxy( function(){ alert(this); return false; }, i ) ); } 

或通过创建新函数捕获您的参数

 var buttons = $("a"); for (var i = 0; i < buttons.length; i++){ $(buttons[i]).unbind("click").click( function(arg){ return function(){ alert(arg); return false; }; }(i) ); } 

只需在firebug控制台中运行其中一个示例即可查看效果。