javaScript中 闭包 的个人理解,话语通俗易懂
2016-03-09 12:38
459 查看
所谓闭包,字面理解就是把一个东西包起来使用从而达到目的!
js中的闭包是怎么样呢的?简单点来说就是当在一个函数内创建了一个函数,这是创建的这个函数就是闭包!它能够读取其他函数内部变量的函数。也就是说将函数内部和外部连接起来!
简单的例子说明下:
function aaa(){ var i = 2; function bbb(){ alert(++i); } return bbb; } aaa()(); //结果为3
有js函数作用域可知:父对象的所有变量,对子对象都是可见的,但反过来是不成立的!
函数aaa嵌套一个函数bbb,按作用域来说,函数外部是访问不到函数aaa内的变量i,但这时候却弹出了3;为什么呢,这就是闭包的存在导致。aaa函数调用最终返回的是一个函数bbb,我们可以将aaa调用的结果储存到一个变量中,在次调用这个变量,例子中没有定义变量,而是直接aaa()();也就是说aaa()它指向的bbb。
我们有时候需要得到函数内的局部变量。但是正常情况下,这是办不到的,只有通过在函数内部在定义一个函数,因为这个字函数有访问它父级变量和参数。
通过一个实例说明下:
假如创建5个li,我们想点击某个li来获得这个li的索引,有人肯定会试试底下这个方法:可是出人意料,用此方法弹出的结果都是5,并不是按着自己的索引来的,原因也很简单,弹出i的那个函数是被绑定在一个点击事件上,没有点击,事件不会触发,可是在点击时候 通过 for 循环,I的值已经被初始化成5了,固然每次弹出的都是5;
window.onload = function(){ var li = document.getElementsByTagName('li'); for(var i=0; i<li.length; i++){ li[i].onclick = function(){ alert(i); } } }
那有什么解决办法呢,看代码:
window.onload = function(){ var li = document.getElementsByTagName('li'); for(var i=0; i<li.length; i++){ (function(index){ li[i].onclick = function(){ alert(index); } })(i); } }
代码中加粗部分就是运用的闭包。
通过此方法就可以获得每个li的索引值,循环时候的i当参数传递到一个自执行的函数,此时的i正是你需要的i。
闭包的用途还很多,下次说。
相关文章推荐
- JS/JQ实现滚动调默认最底部
- js中遍历json
- javascript中的事件解析与示例
- 第三章:JavaScript中的三大流程控制
- JSON.NET对象序列化示例教程
- js兼容性错误导致没有办法留言
- SkyLine JS API介绍及二次开发环境
- jsp:param
- js实现倒计时功能
- JavaScript装逼指南
- js刷新页面方法大全
- lazyload.js延迟加载
- easelJS入门、事件、spritesheet
- javascript基本算法汇总
- extjs查看实例的界面
- js事件绑定及深入
- weblogic下更改jsp不生效的解决办法
- JS中常用正则表达式整理
- IntelliJ IDEA中js代码报如下警告的解决方法
- H5/JS随后分享