两个js节点的困惑

两个js节点的疑惑
刚学习javascript,看视频遇到一个想了一晚上也没想明白的疑点,希望大家指点。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小程序</title>
<script>
window.onload = function(){
var liNodes = document.getElementsByTagName("li");
for(var i=0; i<liNodes.length; i++){
liNodes[i].onclick = function(){
alert(inNodes[i].firstChild.nodeValue); // 为什么这里报未定义?
alert(i); // 这里输出的结果为什么是8? 为什么不是1,2,3,4 等值?

}
}
}
</script>
</head>
<body>
<p>你喜欢哪个城市?</p>
<ul id="city">
<li id="bj" name="BeiJing">北京</li>
<li>上海</li>
<li>东京</li>
<li>首尔</li>
</ul>

<br><br>
<p>你喜欢哪款单机游戏?</p>
<ul id="game">
<li id="rl">红警</li>
<li>实况</li>
<li>*飞车</li>
<li>魔兽</li>
</ul>
</body>
</html>
------解决方案--------------------
window.onload = function(){
  var liNodes = document.getElementsByTagName("li");
  for(var i=0; i<liNodes.length; i++){
    (function(i) {
      liNodes[i].onclick = function(){
        alert(this.innerHTML + i);
      }
    })(i);
  }
}

------解决方案--------------------
引用:
Quote: 引用:

for(var i=0; i<liNodes.length; i++){
liNodes[i].onclick = function(){
alert(inNodes[i].firstChild.nodeValue); // 为什么这里报未定义?
alert(i); // 这里输出的结果为什么是8? 为什么不是1,2,3,4 等值?   //因为执行这个的时候  i 是8 
}
}

整个运行 上下文的i 在for循环中不断变化  你alert(i) 调用的是i    这个i 变量在实际访问的时候才 去获取了i的值
怎么破 看楼上


引用:
for(var i=0; i<liNodes.length; i++){
liNodes[i].onclick = function(){
alert(inNodes[i].firstChild.nodeValue); // 为什么这里报未定义?
alert(i); // 这里输出的结果为什么是8? 为什么不是1,2,3,4 等值?   //因为执行这个的时候  i 是8 
}
}

整个运行 上下文的i 在for循环中不断变化  你alert(i) 调用的是i    这个i 变量在实际访问的时候才 去获取了i的值
怎么破 看楼上


朋友能告诉我为什么 alert(inNodes[i].firstChild.nodeValue); // 为什么这里报未定义? 报未定义?


for(var i=0; i<liNodes.length; i++){

运行完后 i大于  length 所以没有 i指向的元素