Javascript jQuery:I can';t使用动态值在循环中设置值

Javascript jQuery:I can';t使用动态值在循环中设置值,javascript,jquery,html,loops,onchange,Javascript,Jquery,Html,Loops,Onchange,为什么在下面的代码中“我的更新”业务函数总是用数组中的最终值更新输入 for (var i = 0; i < results.length; i++) { var place = results[i]; var input = $("<input/>").change(function(){update_business(place.name)}); 这里的问题是,所有这些事件处理程序函数将共享完全相同的“place”变量;只有一个。相对于事件处理程序,它就像一个全局变量 您

为什么在下面的代码中“我的更新”业务函数总是用数组中的最终值更新输入

for (var i = 0; i < results.length; i++) {
var place = results[i];
var input = $("<input/>").change(function(){update_business(place.name)});

这里的问题是,所有这些事件处理程序函数将共享完全相同的“place”变量;只有一个。相对于事件处理程序,它就像一个全局变量

您可以编写一个单独的函数来帮助:

  function makeHandler(place) {
     return function() {
       update_business(place.name);
     };
   }
然后您可以在循环中调用它:

 var input = $('<input/>').change(makeHandler(place));
var-input=$('').change(makeHandler(place));

该函数返回另一个函数,该函数实际上将用作事件处理程序。因为循环中的变量“place”作为参数传递给“makeHandler”函数,所以它是循环中特定迭代中“place”的唯一副本。因此,每个事件处理程序都有自己的“位置”。

内部函数对外部变量本身具有闭包,而不是其值的副本

您需要通过不使用closed-over变量来传递它的值,但是使用一个新的变量,它的寿命更短

(function(j) {
    var place = results[j];
    ...
})(i);
这里,
i
的值作为
j
参数传递给自调用匿名函数,
j
将始终是调用该函数时的
i

.val()将替换该值,而不是追加该值。 如果您希望添加到当前值,请尝试使用.append

文件

(function(j) {
    var place = results[j];
    ...
})(i);