Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript未将变量写入数字(循环)_Javascript_Html_For Loop - Fatal编程技术网

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=

我有这样一个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=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);
}