我只需要使用部分应用程序将数据传递给回调,我发现我需要一个间接层来防止循环的后续运行更改我传递给回调的数据。
在这里查看一个非常简单的工作示例:http: //jsfiddle.net/s5gVj/
(如果 jsfiddle 是不言自明的,请随时直接跳到下面的问题)
没有间接
这将始终将标签设置为“按下按钮 1”。
无论按下哪个按钮,都会发生这种情况。
for(var i = 0 ; i < buttons.length ; i++)
{
var buttonID = i;
$(buttons[i]).click(
function(e)
{
$("label").html("Button " + buttonID + " pressed.");
});
}
间接地,通过函数
同时,在中间使用一个函数可以解决问题
对于第一个按钮,结果将是“按下按钮 0”
对于第二个按钮,它将是“按下按钮 1”。
var buttonClickHandlerWithID =
function(buttonID)
{
return function(e)
{
$("label").html("Button " + buttonID + " pressed.");
}
}
for(var i = 0 ; i < buttons.length ; i++)
{
$(buttons[i]).click(buttonClickHandlerWithID(i));
}
为什么会这样?函数调用是否有什么特别之处可以确保变量被复制,从而不再引用相同的数据,或者还有其他事情发生?
我希望在每次迭代时重新创建在 for 循环中声明的变量,因此每次迭代都是分开的,但我想不是这样吗?