在for循环中,数组长度为3,我本来是想对每个循环的元素绑定一个点击事件的,结果点击后控制台输出全部为1。

  1. for (var i = 0; i < data.data.length; i++) {
  2. $('.lands').append(
  3. '<button type="button" class="land land' + `${i % 3 + 1}` + '">\
  4. <div class="soil">\
  5. <!-- 成长中的树 -->\
  6. <div class="tree-wrap">\
  7. <img src="../../images/flowering_tree.png" alt="开花中的树" class="tree">\
  8. <div class="land-bubble land-bubble__top watering">\
  9. <img src="../../images/watering.png" alt="浇水">\
  10. </div>\
  11. <div class="gif gif-top watering-gif">\
  12. <img src="../../images/gif/watering.gif" alt="浇水动画">\
  13. </div>\
  14. </div>\
  15. <div class="soil-tips">'+ list[i].farmName + list[i].cropTypes + '</div>\
  16. <a onClick = detail(' + list[i].farmId + ') class="gofarm-btn">去农场看看</a>\
  17. </div>\
  18. </button>'
  19. );
  20.  
  21. var className = '.land' + `${i % 3 + 1}`
  22. console.log(className)
  23. $(className).click(function(){
  24. console.log(`${i % 3 + 1}`)
  25. })
  26. }

我觉得这与闭包的知识有关,由于i是全局的作用域,相当于同一个引用,等循环执行完,最终的i的值为i%3+1=1,然后在点击的时候输出的便全部为1了。

解决方案:加一个立即执行函数,暂时保存i的值到函数里成为j,这样就形成了一个闭包,每个函数里的j各不相同,在内存中是不同的引用,从而解决了这个问题。

  1. for (var i = 0; i < data.data.length; i++) {
  2. $('.lands').append(
  3. '<button type="button" class="land land' + `${i % 3 + 1}` + '">\
  4. <div class="soil">\
  5. <!-- 成长中的树 -->\
  6. <div class="tree-wrap">\
  7. <img src="../../images/flowering_tree.png" alt="开花中的树" class="tree">\
  8. <div class="land-bubble land-bubble__top watering">\
  9. <img src="../../images/watering.png" alt="浇水">\
  10. </div>\
  11. <div class="gif gif-top watering-gif">\
  12. <img src="../../images/gif/watering.gif" alt="浇水动画">\
  13. </div>\
  14. </div>\
  15. <div class="soil-tips">'+ list[i].farmName + list[i].cropTypes + '</div>\
  16. <a onClick = detail(' + list[i].farmId + ') class="gofarm-btn">去农场看看</a>\
  17. </div>\
  18. </button>'
  19. );
  20.  
  21. (function(j){
  22. var className = '.land' + `${j % 3 + 1}`
  23. console.log(className)
  24. $(className).click(function(){
  25. console.log(`${j % 3 + 1}`)
  26. })
  27. })(i)
  28. }

JavaScript循环出现的问题——用闭包来解决的更多相关文章

  1. 前端(十三)—— JavaScript高级:回调函数、闭包、循环绑定、面向对象、定时器

    回调函数.闭包.循环绑定.面向对象.定时器 一.函数高级 1.函数回调 // 回调函数 function callback(data) {} // 逻辑函数 function func(callbac ...

  2. JavaScript闭包理解【关键字:普通函数、闭包、解决获取元素标签索引】

    以前总觉得闭包很抽象,很难理解,所以百度一下"闭包"概览,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的 ...

  3. JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】

        一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...

  4. 深入理解JavaScript系列(16):闭包(Closures)

    介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure).闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭 ...

  5. Jquery和Javascript 实际项目中写法基础-闭包 (2)

    一.什么是闭包? 概念性的我就不去百度了,感兴趣的可以自己去搜下,我自己的理解,闭包就是一个封装的包,相当于类的概念,把乱七八糟的的东西封装到一起,然后统一使用一个对象来调用,实现代码部分对外开放,部 ...

  6. JavaScript循环之for/in循环

    今天学到了JavaScript的语句篇.同其他常见编程语言如C.Java等一样,JavaScript中的语句包含:①表达式语句②复合语句和空语句③声明语句④条件语句⑤循环语句⑥跳转语句,当然JavaS ...

  7. 【译】学习JavaScript中提升、作用域、闭包的终极指南

    这似乎令人惊讶,但在我看来,理解JavaScript语言最重要和最基本的概念是理解执行上下文.通过正确学习它,你将很好地学习更多高级主题,如提升,作用域链和闭包.考虑到这一点,究竟什么是"执 ...

  8. JavaScript循环语句-6---for语句,while语句的应用逻辑

    JavaScript循环语句 学习目标 1.掌握for语句的语法结构 2.掌握for语句的应用逻辑 for语句 语法: For(语句1:语句2:语句3){ 被执行的代码块: } 语句1:在循环(代码块 ...

  9. JavaScript 循环语句入门详解

    JavaScript Switch 语句 语法 switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: n 与 case ...

随机推荐

  1. iOS组件化开发一使用source管理远端库升级(四)

    一.克隆远端库代码到本地选择master分支 1.克隆 2.代码会显示出你所有版本的tag 二.可以在Example目录下验证代码的正确行: cd 到库的文件夹然后 pod install comma ...

  2. 微信小程序社区爬取

    # CrawlSpider 需要使用:规则提取器 和 解析器 # 1. allow设置规则的方法:要能够限制在目标url上面, 不要跟其他的url产生相同的正则即可 # 2. 什么情况下使用follo ...

  3. c++快速排序算法

    c++快速排序算法 题目描述 利用快速排序算法将读入的NN个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.(C++选 ...

  4. 数字IC后端布局阶段对Tie-high和Tie-low Net的处理

    本文转自:自己的微信公众号<集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众平台 ...

  5. 再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三(走过路过不要错过)

    Gitlab runner 快速搭建CICD pipeline 背景 日常开发中,相信大家已经做了很多的自动化运维环境,用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包,部署 ...

  6. C# 使用XDocument实现读取、添加,修改XML文件

    新建xml文件编写如下内容做测试使用 需要引用:System.Xml.Linq 命名空间 一.读取XML 读取所有文档  筛选子元素为attribute1的元素,结果是IEumerable 通过Lin ...

  7. JavaScript捕获与冒泡与委托

    事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件. 相反的,事件冒泡是自下而上的去触发事件. 并不是所有的事件都能冒泡,以下事件不冒泡:blur.focus.load.un ...

  8. JAVA接口的继承与集合

    复习 20190701 接口补充 一. java是单继承多实现 单继承: 一个类只能有一个父类 public class D extends D1 { } 2. 多实现 一个类可以同时实现多个接口 当 ...

  9. [转载]nginx负载均衡+keepalived三主(多主)配置

    nginx负载均衡+keepalived三主(多主)配置 1.实验环境,实现目标三台主机分别配置nginx负载均衡对后端多台主机做转发,同时配置keepalived实现HA,保证任意主机出现故障时其他 ...

  10. 个人永久性免费-Excel催化剂功能第91波-地图数据挖宝之行政区域信息实时下载(含经纬度)

    移动互联网和O2O兴起的这十年时间里,由地图LBS功能衍生出一大堆的极高商业价值的数据及应用,地图相关的数据,也是数据分析过程中一个大宝藏,从此篇开始将带给大家一系列的地图相关的数据采集,满足数据分析 ...