Javascript闭包演示【转】
2015-09-05 21:48
495 查看
文章出自http://www.cnblogs.com/snandy/archive/2011/03/01/1967628.html
有个网友问了个问题,如下的html,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4。
以上场景是初学者经常碰到的。即获取HTML元素集合,循环给元素添加事件。在事件响应函数中(event handler)获取对应的索引。但每次获取的都是最后一次循环的索引。
原因是初学者并未理解JavaScript的闭包特性。通过element.onclick=function(){alert(i);}方式给元素添加点击事件。响应函数function(){alert(i);}中的 i 并非每次循环时对应的 i(如0,1,2,3,4)而是循环后最后 i 的值5。 或者说循环时响应函数内并未能保存对应的值 i,而是最后一次i++的值5。
了解了原因,摸索出了很多解决办法(纯粹是兴趣)。最先想到的前两种
1、将变量 i 保存给在每个段落对象(p)上
2、将变量 i 保存在匿名函数自身
后又想到了三种
3、加一层闭包,i 以函数参数形式传递给内层函数
4、加一层闭包,i 以局部变量形式传递给内层函数
5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)
后又发现了两种
6、用Function实现,实际上每产生一个函数实例就会产生一个闭包
7、用Function实现,注意与6的区别
相关文章推荐
- [连载]Tutorial series: learning how to write a 3D soft engine from scratch in C#, TypeScript or JavaScript[英]
- Js中的this和window.event.srcElement
- JavaScript学习笔记(一)
- Javascript高级程序设计——BOM(浏览器对象模型)
- jsp分页代码
- JSR 303 - Bean Validation 介绍及最佳实践
- Javascript中的事件绑定
- JavaScript实现用户注册表单的简单检查
- 关于使用JavaScript实现图片点击切换(附带改变导航图片 方案二)
- JavaScript技巧(二)续
- angular js的一些操作
- js 页面跨域
- 了解 JavaScript 应用程序中的内存泄漏
- JavaScript实现分类列表显示与隐藏的切换
- JavaScript实现动态倒计时跳转页面
- (一)我的Javascript系列:Javascript的面向对象旅程(上)
- JS中子类中如何调用父类的同名方法(继承时候,父类的同名方法被覆盖了)
- js控制滚动条联动
- mvc json 日期问题的最简单解决方法
- 正则表达式炼级攻略