<body>
<form id="userForm">
<div id="advTest">
<span>0</span> -- <span>1</span> -- <span>2</span> -- <span>3</span>
</div>
<hr />
<div id="advTest2">
<span>0</span> -- <span>1</span> -- <span>2</span> -- <span>3</span>
</div>
<input type="button" value="Test" id="btnTest" />
</form>
<script type="text/javascript">
//for逻辑块
var i = 0;
var spans = $("#advTest span");
for (i; i < spans.length; i++) {
spans[i].onclick = function () {
alert(i);
}
}
i++;
//if逻辑块
var v = 0;
if (true) {
document.getElementById("btnTest").onclick = function test() {
alert(v);
}
}
v++;
</script>
</body>
有些问题不解,希望解答 谢谢:
对于for逻辑体,先抛开i++不说,这个例子是典型for循环内引用全局变量造成绑定都是一个值的问题。在绑定click监听时,函数并未执行,当在触发click时,全局变量i的值是多少就alert多少。如果抛开i++,是4没问题。但是我后面有了i++,在click之前 i 的值已经改变,为什么alert的不是5呢?很是费解。而if逻辑块,输出的就是v++后的值。它们区别在哪呢??
因为你需要在事件内使用事件外的循环变量i。
当事件触发时,那个循环早就结束了,那时的i的值已经是循环最大值加1了。
所以需要用一些方式保存住当前循环的i的值。
for (var i = 0; i < arr.length; i++) {
(function(i){
arr[i].onclick = function () {
alert(i);
}
})(i);
}
for (var i = 0; i < arr.length; i++) {
let k = i;
arr[i].onclick = function () {
alert(k);
}
}
ps:IE11中在for语的()内声明的let是整个循环体中共用的,只有在{}内声明的let才是每次循环都独立的。
非ie的浏览器中可以在中在for语的()内声明let
for (let i = 0; i < arr.length; i++)
for (var i = 0; i < arr.length; i++) {
arr[i].index = i;
arr[i].onclick = function () {
alert(this.index);
}
}
上面的代码并不是函数,只会运行一次 ,初始化的时候值已经绑定了。