js for循环中定义clike事件由于闭包导致的循环变量获取不到的问题
在网上找的 记下来以备不时之需
案例; 本人有一个数组按钮 循环数组按钮 给每个按钮添加click事件 原本以为搞定但是出现了 每个按钮都是数组最后的方法
然后查找问题 发现onclike事件中的i总是最后一个
在网上找的资料:
下面做下分析:因为在for循环里面指定给id i的事件处理程序,也就是onclick那个匿名函数是在for循环执行完成后(用户单击链接时)才被调用的。而调用时,需要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义。然后,又到方法外部去查找,此时有定义,但i的值是4(只有i大于4才会停止执行for循环)。因此,就会取得该值——这正是闭包(匿名函数)要使用其外部作用域中变量的结果。而且,这也是由于匿名函数本身无法传递参数(故而无法维护自己的作用域)造成的。
解决办法:
- for (var i = 0; i <= list_obj.length; i++) {
- (function(i){
- list_obj[i].onclick = function() {
- alert(i);
- }
- })(i);
- }
这是在网上搜的一个解决办法 由于本人搞后台 对js处理不甚了解 发现解决办法 瞬时惊为天人 所以 特地记下来以备不时之需.
js for循环中定义clike事件由于闭包导致的循环变量获取不到的问题的更多相关文章
- 【Javascript】: for循环中定义的变量在for循环体外也有效
		for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = ... 
- Backbone.js 的 View 中定义事件
		使用 Backbone 的 View 时,可以象传统 jQuery 那样定义事件,$("selector").click(function(){...}).幸运的是 Backbon ... 
- js的for循环中出现异步函数,回调引用的循环值总是最后一步的值?
		这几天跟着视频学习node.js,碰到很多的异步函数的问题,现在将for循环中出现的异步函数回调值的问题总结如下: 具体问题是关于遍历文件夹中的子文件夹的,for循环包裹异步函数的代码: for (v ... 
- VB.NET在基类中定义共享事件(类似于C#中的静态事件)
		基类: Public Class userFun Private Shared _PnlStatus As String ‘必须设为共享字段,如果不设为Shared,将不能传递字符串内容 Public ... 
- Labview一个循环中放两个事件结构会导致前面板锁定的问题
		建议在同一个循环中,只放置一个事件结构.此时,当一个事件发生时,事件结构将对事件进行处理,然后继续循环,事件结构再等待下一个事件发生. 如在同一个循环中放置两个事件结构,只有在两个事件结构都处理了事件 ... 
- js和jquery中的触发事件
		改别人的坑,遇到jquery选择器和fireEvent混用,不认识fireEvent方法报错. js的方法不能使用jquery的选择器去调用. 1.fireEvent (IE上的js方法 ) 我们来看 ... 
- js的for循环中出现异步函数,回调引用的循环值始终是最后的值
		一.问题 今天工作中解决bug发现是由“for循环的异步函数,回调引用的循环值始终是最后的值”的现象导致的,如: for (var i = 0; i < files.length; i++) { ... 
- C#:实现接口中定义的事件
		public delegate void TestDelegate(); // delegate declaration public interface ITestInterface { event ... 
- js闭包理解案例-解决for循环为元素注册事件的问题
		转发自http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 一.变量的作用域 要理解闭包,首 ... 
随机推荐
- 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
			上一篇写的是基本的设计方案,由于考研复习很忙,不知道下一次什么时候才能打开博客,今天就再写一篇.写一写CPU中涉及到RAM的部件,如寄存器堆.数据存储器等. 大家应该在大一刚接触到计算机的时候就知道R ... 
- ORACLE视图简单创建和使用
			1.创建 create view v (pdate,goodsId,productionId,qty)列名 as select p.pdate,p.goodsId,p.productionId,sum ... 
- require和load的不同之处
			require和load最大的不同之处在于,require就算调用多次也不会重新加载已经加载过的文件.Ruby会持续追踪已经被请求的那些文件而不会重复加载它们.而load命令总是会加载所请求的命令,不 ... 
- 伪Ajax-iframe
			由于HTML标签的iframe标签具有局部加载内容的特性,所以可以使用其来伪造Ajax请求. <!DOCTYPE html> <html lang="en"> ... 
- Spring源码学习(6)——容器的功能扩展
			之前的随笔中借BeanFactory介绍了bean的解析和加载的完整过程,实际上,除了BeanFactory,spring还提供了一种功能更加强大的容器:ApplicationContext Appl ... 
- holer实现外网访问本地tomcat
			外网访问内网Tomcat 内网主机上安装了Tomcat,只能在局域网内访问,怎样从公网也能访问本地Tomcat? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装Java 1.7 ... 
- linux 入门学习
			一.命令 1.命令提示符 [root@localhost ~]# [] :提示符的分隔符,无特殊含义: root:当前的登录用户: @:分隔符,无特殊含义: localhost:当前主机名(完整名称: ... 
- 添加PROPAGATION_REQUIRES_NEW 事务没有产生作用
			最近在做事务添加时 发现自己的事务没有新建,上网查到 仅用作收藏. 其二 注意 事务的注解 应该在 内层的事务上面 一.描述Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAG ... 
- 小程序 movable-area 实现悬浮窗效果
			最近做一个小程序 实现页面内悬浮窗的效果 给自己制定两个方案: 1.通过一个自定义的组件,通过触摸事件进行实现: 2.使用微信的movable移动组件实现: 第一种方案: 结果:实现了 悬浮窗和自动靠 ... 
- Pycharm 常用快捷键与设置
			pycharm高频率使用的快捷键 Ctrl+Shift+F10 运行当前的页面 Ctrl + / 注释(取消注释)选择的行 Ctrl+Shift+F 高级查找 Shift + Enter 开始新行 T ... 
