function init() {
var ps = document.getElementsByTagName("p"); //body内有四个p标签
for (var i=0; i<ps.length; i++) {
ps[i].onclick = function() {
console.info(i);
}
}
}
// 1. console.info(i); 的执行是需要用户点击后执行的,当用户点击的时候,for 循环的执行已经结束,那么 i 的值已经被设置成了 4,也就说当用户去点击的时候 i 的值已经是 4 了;
// 2. 当 console.info(i); 执行的时候,会根据作用域链去查找 i,这样会找到 for 中定义的全局 i,这个时候不管点击那个 p 标签其实打印的都是全局 i 变量,所以结果都是统一的 4;
// 解决方案一:
function init() {
var ps = document.getElementsByTagName("p");
for (var i=0; i<ps.length; i++) {
(function(n) {
ps[n].onclick = function() {
console.info(n);
}
})(i);
}
}
// 解决方案二:
function init() {
var ps = document.getElementsByTagName("p");
for (let i=0; i<ps.length; i++) {
ps[i].onclick = function() {
console.info(i);
}
}
}
原文:http://www.cnblogs.com/zjp975570311/p/6555430.html