Javascript 循环和闭合
我有一些代码生成了一组Javascript 循环和闭合,javascript,loops,dom,closures,dom-events,Javascript,Loops,Dom,Closures,Dom Events,我有一些代码生成了一组按钮元素,并通过一些DOM函数将它们附加到正文中的div。它动态地为每个按钮的onclick事件设置一组匿名函数(事件处理程序) 这是通过从0迭代到20来执行的 问题是,我想在事件处理程序中使用循环计数器I,但是,作为循环中该迭代的值,而不是作为I获得的最终值。起初,我以为我可以通过闭包来实现这一点,但后来我意识到它并没有像我最初认为的那样执行i不断更改每次迭代,所有其他anon函数(通过闭包?)必须看到相同的i,因为它范围内的i都指向相同的值。因为当您触发onclick时
按钮
元素,并通过一些DOM函数将它们附加到正文
中的div
。它动态地为每个按钮的onclick
事件设置一组匿名函数(事件处理程序)
这是通过从0
迭代到20
来执行的
问题是,我想在事件处理程序中使用循环计数器I
,但是,作为循环中该迭代的值,而不是作为I
获得的最终值。起初,我以为我可以通过闭包来实现这一点,但后来我意识到它并没有像我最初认为的那样执行i
不断更改每次迭代,所有其他anon函数(通过闭包?)必须看到相同的i
,因为它范围内的i
都指向相同的值。因为当您触发onclick
时,它们都报告相同的值
所以我想,我该如何着手解决这个问题呢?我尝试将I
设置为另一个变量,以此类推,但结果都是一样的,因为新变量的值在每次迭代中都会更新,就像I
一样。我想我错过了一些简单的东西
<!DOCTYPE html>
<html>
<head>
<title>loop closure test</title>
<script language="javascript" type="text/javascript">
window.onload = function() {
var div = document.getElementById("myDiv");
for( var i = 0; i <= 20; i++ ) {
var b = document.createElement("button");
b.setAttribute("type","button");
b.appendChild(document.createTextNode("Button" + i.toString()));
b.onclick = function(event) {
var date = new Date( 2012, 3, i );
alert( date.getMonth() + "/" + date.getDate() + "/" + date.getFullYear() );
}
div.appendChild(document.createElement("br"));
div.appendChild(b);
}
}
</script>
</head>
<body>
<div id="myDiv"></div>
</body>
</html>
尝试使用如下的闭包:
var div = document.getElementById("myDiv");
for( var i = 0; i <= 20; i++ ) {
var b = document.createElement("button");
b.setAttribute("type","button");
b.appendChild(document.createTextNode("Button" + i.toString()));
b.onclick = function(pos) {
return function(event) {
var date = new Date( 2012, 3, pos );
alert( date.getMonth() + "/" + date.getDate() + "/" + date.getFullYear() );
}
}(i);
div.appendChild(document.createElement("br"));
div.appendChild(b);
}
var div=document.getElementById(“myDiv”);
对于(var i=0;i可能是Yes的重复项),它将在每个循环中使用闭包。需要知道的关键是JavaScript局部变量的作用域是在函数级别。因此,如果您想为每个处理程序指定自己的“i”,您需要在另一个函数中实例化处理程序函数。关于这个问题,有很多很多StackOverflow问题。@Pointy这根本不是jQuery,您链接的问题对我来说是完全陌生的。无论您是否使用jQuery,都是同一个问题;毕竟jQuery只是JavaScript。
var div = document.getElementById("myDiv");
for( var i = 0; i <= 20; i++ ) {
var b = document.createElement("button");
b.setAttribute("type","button");
b.appendChild(document.createTextNode("Button" + i.toString()));
b.onclick = function(pos) {
return function(event) {
var date = new Date( 2012, 3, pos );
alert( date.getMonth() + "/" + date.getDate() + "/" + date.getFullYear() );
}
}(i);
div.appendChild(document.createElement("br"));
div.appendChild(b);
}