猿问

javascript小函数,为什么for循环遍历dom节点,监听点击事件,输出都是一样的呢?

我想通过for循环内嵌一个事件监听,捕获我点击的是哪个个区域,执行对应函数。可是为什么点击第一个或第二个区域,输出都是2呢?
不是应该对应 0 和 1 吗


<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>为什么</title>
	<style type="text/css">
		.container{
			width: 100px;
			height: 100px;
			border: 1px solid black;
		}
	</style>
</head>
<body>
	<div class="container">container1</div>
	<div class="container">container2</div>

	<script type="text/javascript">
		var container = document.getElementsByClassName("container");
		console.log(container.length);			//2
		for (var i = 0; i < container.length; i++) {
			container[i].onmouseup = function(){
				console.log(container)
				console.log(i)					//2 (不明白为什么,不是应该0或1吗)
			}
		}
	</script>
</body>
</html>


newsudhc3634140
浏览 3466回答 6
6回答

qq_邪风曲_0

引用上面老兄的一句话:“这是异步加载的过程”,你每次up的时候i根本储存的都是最后一个值,没法取到你想要对应的值。所以这边你要设法循环中把值取到。一种方法就是用闭包的来取值,另外一种就是使用es6里面的let来代替var声明变量i

烈日当空0707

这个是闭包问题。你上网一搜就有了。

qq_堕落的撒旦_0

啊,抱歉,我是新手,不太懂这个问题····

但我会继续努力的

因为你的i是从0开始的,所以有0和1两个作为变量i的值,所以最后输出为2.for (var i = 0; i < container.length; i++) {//这里的i=0,1,你可以alert(i)看看结果,这就知道为嘛了。            container[i].onmouseup = function(){                console.log(container)                console.log(i)                  //2 (不明白为什么,不是应该0或1吗)            }
随时随地看视频慕课网APP
我要回答