下面的代码中,为什么 elems[i]的结果是 undefined?
代码及运行效果也可在 JS Bin 中查看:https://jsbin.com/tixujoyibu/edit?html,css,js,console,output
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS Bin</title>
</head>
<body>
<div class="link">
<a href="#">壹</a>
<a href="#">贰</a>
<a href="#">叁</a>
<a href="#">肆</a>
</div>
</body>
</html>
var elems = document.getElementsByTagName("a");
for(var i = 0; i < elems.length; i++ ){
elems[i].addEventListener("click",function(){
console.log("i = " + i);
//运行结果:"I am link # undefined",为什么得到的 elems[i]是 undefined 呢?
console.log("I am link # " + elems[i]);
});
}
1
rabbbit 2019-05-21 21:29:35 +08:00
for(var i = 0; i < elems.length; i++ ){
-> for(let i = 0; i < elems.length; i++ ){ 知识点: 作用域 闭包 |
2
ted94 2019-05-21 21:37:49 +08:00 via Android
闭包。你都有输出 i 了。
|
3
molvqingtai 2019-05-21 22:00:30 +08:00
把 var 改为 let
|
4
wi 2019-05-21 22:09:56 +08:00
闭包,for 执行完之后 i == elems.length
|
5
iugo 2019-05-21 22:41:33 +08:00 1
作为初中教师资格证持有者, 详解一下:
``` for(var i = 0; i < 4; i++){ elems[i].addEventListener("click",function(){ console.log("i = " + i); }); } ``` 1. 当 for 循环执行时, 在外层作用域定义了一个 i, 初始值是 0. 2. 事件监听函数会从外部引入一个变量 i. (所谓闭包) 3. 每次 i < 4 判断成功之后, 都执行一次 i++, 所以 i = 3 时, 后面跟着执行了 i++, 此时 i = 4. 下次再判断时不再成立, 所以 i 停留在 4. 4. 数组长度为 4, 只有 0,1,2,3. 所以 elems[4] 就是 undefined. 或许换成以下这样你能理解: ``` var i = 0; for(; i < 4; i++){ elems[i].addEventListener("click", test); } function test(){ console.log("i = " + i); } ``` |
6
brust 2019-05-22 09:09:00 +08:00
把 var i 换成 let i
|
7
chenyu0532 2019-05-22 09:42:31 +08:00
自从看了 var let 的区别,反正我是完全抛弃了 var
|
8
manyfreebug OP 都提到了闭包,看来是我没掌握闭包
|