#javascript#用闭包的方式解决循环中的i值异常

以下代码未按预期的效果输出
<p>11111</p>
<p>22222</p>
<p>33333</p>
<p>44444</p>
<p>55555</p>
var pAry = document.getElementsByTagName("p"); 

for (var i = 0; i < pAry.length; i++) {
  pAry[i].onclick = function () {
    console.log(i);
  };
}  
浏览器控制台输出效果不是预期结果
预期结果
用闭包可以来解决这个问题,让代码按预期输出

方法一:将i保存在每个段落对象的一个属性上

for (var i = 0; i < pAry.length; i++) {
  pAry[i].i = i;
  pAry[i].onclick = function () {
    console.log(this.i);
  };
}

方法二:将i保存在匿名函数本身的一个属性上

for (var i = 0; i < pAry.length; i++) {
  (pAry[i].onclick = function () {
    console.log(arguments.callee.i);
  }).i = i;
}

方法三:在外面再加一层闭包,将i保存在一个局部变量tmp上

for (var i = 0; i < pAry.length; i++) {
  (function () {
    var tmp = i;
    pAry[i].onclick = function () {
      console.log(tmp);
    };
  })();
};

方法四:在外面再加一层闭包,将i的值复制到参数num里

for (var i = 0; i < pAry.length; i++) {
  (function (num) {
    pAry[i].onclick = function () {
      console.log(num);
    };
  })(i);
}

方法五:在外面再加一层闭包,返回一个函数作为响应事件

for (var i = 0; i < pAry.length; i++) {
  pAry[i].onclick = function (num) {
    return function () {
      console.log(num);
    }
  }(i);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一、什么是闭包? 闭包就是可以访问另...
    何叔best阅读 645评论 0 0
  • 作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 Java...
    劼哥stone阅读 1,199评论 1 13
  • 查阅书籍:JavaScript权威指南 函数声明与函数表达式 用函数声明定义的函数,函数可以在函数声明之前调用,而...
    雪萌萌萌阅读 366评论 1 9
  • 今天学了内部类 下面是内部类的一些用法和要求 一个.java文件可以有多个类,但是只能有一个public 内部类可...
    惨不忍睹阅读 152评论 0 0
  • 上次我们说到要进行网络营销,首先得有一个落地页,详情请阅读:婚纱摄影网络营销应该从哪入手?。今天我们谈谈有了落地页...
    礼糖网阅读 1,329评论 0 0