JS之经典for循环闭包问题解决方法

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <link rel="stylesheet" href="bootstrap.css">

</head><body>    <div class="container">    <div class="row">        <div class="col-md-3">            <hr>            <div class="panel panel-info">                <div class="panel-heading">                    <h3 class="panel-title">闭包经典实例</h3>                    <div>                        <div class="panel-body">                            <ul class="list-group">                                <li class="list-group-item">1</li>                                <li class="list-group-item">2</li>                                <li class="list-group-item">3</li>                                <li class="list-group-item">4</li>                                <li class="list-group-item">5</li>                            </ul>                        </div>                    </div>                </div>            </div>        </div>    </div>    </div>    <script >        var liList=document.getElementsByTagName(‘li‘);

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

liList[i].number=i;            liList[i].onclick=function(){                alert(this.number)            }

//            (function (i){//                liList[i].onclick=function( ){//                    alert(‘当前点击第‘+ i+‘个‘);//                }//            })(i)        }    </script></body></html>

像这样一个代码片段,初学者会理所当然地认为依次点击Li会弹出相应的0、1、2、3、4  但实际结果是每次都是4原因是:每次点击输出i的时候,函数内部没有i,就从外部函数查找,而外部函数的值是每一次循环后的值4,所以每次点击输出的都是4

解决办法一:加一层闭包,i 以函数参数形式传递给内层函数:
          (function (i){             liList[i].onclick=function( ){                  alert(‘当前点击第‘+ i+‘个‘);              }          })(i)

解决办法二:找个属性将i值保存起来,然后弹出这个值
        liList[i].number=i;            liList[i].onclick=function(){                alert(this.number)            }


原文地址:https://www.cnblogs.com/zhumingyong/p/8994636.html

时间: 2024-10-10 21:16:46

JS之经典for循环闭包问题解决方法的相关文章

js中有哪些是循环遍历的方法?

1 each方法 jquery的方法,不能使用break打断循环,return falsed代表for循环中的break obj.each(function (i,item) { // i:循环的下标 // item:循环的节点 // $(this):jquery对象 // $(item):获得要循环的div的单个jquery对象 }) $.each(obj,function (i,item) { // i:下标 // item:循环的节点对象 // $(this):jquery对象 // $(

js Date()日期函数浏览器兼容问题解决方法

一般 直接new Date() 是不会出现兼容性问题的,而 new Date(datetimeformatstring) 常常会出现浏览器兼容性问题,为什么,datetimeformatstring中的某些格式浏览器不兼容. 1. 无参 //无参 所有浏览器都兼容 var dateTime = new Date(); 2.日期参数 //日期参数 格式1 var dateTime = new Date("2017-09-12"); a. IE > IE9-(不兼容) > IE

笔记-[js兼容]-滚动条的滚动距离的兼容性问题解决方法。

在我们操作JS实现些效果的时候,可能会涉及到滚动条滚动距离的问题; 在IE和非IE下是存在兼容性问题的 在IE下支持:document.body.scrollTop(scrollLeft);//在ie下获取滚动条距离的属性 在非IE下支持:document.documentElement.scrollTop(scrollLeft);//在非ie下获取滚动条距离的属性 代码兼容: var scrollTop;//定义一个变量名为scrollTop为滚动条的距离 滚动高度 :  var scroll

js settimeout定时 for循环问题 闭包

js settimeout定时 for循环问题 闭包先做个笔记 留待研究 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="jquery.1.7.2.min.js&q

Crosswalk Cordova windows下编译出现:bin\node_modules\q\q.js:126 throw e问题解决方法

Crosswalk Cordova windows下编译出现:bin\node_modules\q\q.js:126   throw e问题解决方法 Crosswalk Cordova 编译出现以下问题 D:\code\crosswalk\crosswalk-cordova-10.39.235.15-arm\bin\node_modules\q\q.js:126 throw e; ^ Package name must look like: com.company.Name 原因是:create

js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数.无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性. 对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

js中数组去重的几种方法

js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                         for(var i=0;i<arr.length;i++){                                 for(var j=i+1;j<arr.length;j++){                                         if(ar

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f