JavaScript未将变量写入数字(循环)
我有这样一个javascript代码,这总是给我一个问题JavaScript未将变量写入数字(循环),javascript,html,for-loop,Javascript,Html,For Loop,我有这样一个javascript代码,这总是给我一个问题 for(var i=1;i<9;i++){ document.getElementById('element'+i).onclick=function(){ theFunc(i) } } for(var i=1;i您的事件处理程序函数具有对i的持久引用,而不是您发现的其值的副本 为防止出现这种情况,请将该功能关闭在不会改变的其他功能上: for(var i=
for(var i=1;i<9;i++){
document.getElementById('element'+i).onclick=function(){
theFunc(i)
}
}
for(var i=1;i您的事件处理程序函数具有对i
的持久引用,而不是您发现的其值的副本
为防止出现这种情况,请将该功能关闭在不会改变的其他功能上:
for(var i=1;i<9;i++){
document.getElementById('element'+i).onclick=makeHandler(i);
}
function makeHandler(index) {
return function() {
theFunc(index);
};
}
…它从元素的id
中获取要使用的值
另一种方法是委托,实际上是将click
事件挂接到一个祖先元素上(所有这些elementX都有一个相同的元素),然后当点击发生时,查看事件。target
及其祖先,看看你应该做什么。当你说theFunc(i)
您正在围绕i
创建一个闭包,这样每个函数调用都引用同一个变量。您需要将函数包装在外部闭包中,以确保每个函数调用使用唯一的变量:
for(var i=1;i<9;i++){
(function(i){
document.getElementById('element'+i).onclick=function(){
theFunc(i);
}
})(i);
}
for(var i=1;iTJ Crowder的答案是解决问题的最佳方法。您在闭包过程中遇到的这个“问题”是用多种语言设计的,称为范围
下面很好地解释了JavaScript中的不同作用域(包括闭包)以及如何使用它们。
找到它:可能是重复的。@BenjaminGruenbaum:我们应该把它放在书签中,真的。:-@T.J.Crowder我已经添加了它们。我不明白为什么这会被否决。但是,请注意,在每次循环迭代中创建一个新的生成器函数不是最佳做法(您必须创建一个新的事件处理程序,但实际上在每个循环上创建了两个函数:生成器函数和事件处理程序函数。)另外,为了清楚起见,我总是建议使用不同的参数名称。@T.J.Crowder我想你刚才解释了为什么它应该被否决。这还因为它关闭了所有其他局部变量,不允许它们被GC’ed。你的答案不允许,这很好。@Ian-假设还有其他局部变量es,当然…@JustinEthier,当然,我只是指出:)你是伟大的T.J.Crowderal虽然它的支持有限,并且弄乱了参数顺序,但你也可以使用.bind()
:。我不确定我会推荐它用于这种情况,但它是有效的
for(var i=1;i<9;i++){
(function(i){
document.getElementById('element'+i).onclick=function(){
theFunc(i);
}
})(i);
}