【发布时间】:2014-06-30 16:08:18
【问题描述】:
我只需要使用部分应用程序将数据传递给回调,我发现我需要一个间接层来防止循环的后续运行更改我传递给回调的数据。
这里有一个非常简单的工作示例: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 循环中声明的变量,因此每次迭代都是独立的,但我猜不是这样?
【问题讨论】:
-
而不是添加
buttons.length - 1数量的click事件 - 您可能想要考虑委托,即将单击事件添加到父容器并按按钮类过滤目标... -
@tborychowski 有问题的按钮是由 jQueryUI 生成的,我真的不想以一种易碎的方式摆弄它们(它们在它可以为对话框创建的按钮列表中)。所以他们共享相同的类,我可以检测到他们的位置,但我觉得这更可取。
-
@Bergi 非常正确,它会回答我的问题,谢谢。我认为,虽然这里的答案需要较少的先验知识。 (我忘记了函数/块范围,这可能会使那里的答案更难解释)。
-
@tborychowski 虽然在单独存储状态的同时可能共享点击事件?我会调查的。感谢您的提示。
标签: javascript partial-application