美文网首页
#javascript#用闭包的方式解决循环中的i值异常

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

作者: Miya_hope | 来源:发表于2016-09-21 17:07 被阅读0次
以下代码未按预期的效果输出
<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#用闭包的方式解决循环中的i值异常

    以下代码未按预期的效果输出 用闭包可以来解决这个问题,让代码按预期输出 方法一:将i保存在每个段落对象的一个属性上...

  • 各种方法实现选项卡功能(闭包,this,let,jquery,v

    HTML和CSS代码 方法1(this) 方法2(闭包) 方法3(let) 与this类似,只是for循环中的i用...

  • 关于闭包的一些问题

    lis[i] == undefind; i == 3; 原因:闭包,i取for()循环的最后一个值。 解决方法: ...

  • for循环中的lambda与闭包

    for循环中的lambda与闭包 问题引入 f = [lambda x: x*i for i in range(3...

  • 复习四

    1,什么是闭包? 解:函数的嵌套就是闭包 内部函数可以引用外部函数的变量. 2,用闭包做什么? 解:用闭包存循...

  • ES6学习笔记1

    let命令 let命令声明的变量只在所在代码块内生效,适用于for循环中的变量。经典的闭包问题如果用let来作为循...

  • js封闭函数、闭包

    1、封闭函数 2、用变量的方式定义函数 3、闭包 4、闭包存循环的索引值 5、闭包做私有变量计数器 6、闭包做选项...

  • 前端笔记13

    封闭函数 用变量的方式定义函数 闭包 闭包存循环的索引值 闭包做私有变量计数器 闭包做选项卡 跳转原页面 获取地址...

  • flutter【5】dart语言--流程控制语句

    if-else 条件必须是布尔型的值。 for循环 dart for循环中的闭包可以捕获循环的 index 索引值...

  • JavaScript学习四

    封闭函数 用变量的方式定义函数 闭包 闭包存循环的索引值 闭包做选项卡 获取地址栏参数 Math 单体创建对象 工...

网友评论

      本文标题:#javascript#用闭包的方式解决循环中的i值异常

      本文链接:https://www.haomeiwen.com/subject/erpaettx.html