您的位置:首页 > Web前端 > JavaScript

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。

闭包的用途还很多,下次说。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: