标签:
第一,利用闭包可以读取外部的变量。
变量分为两种,一种是全局变量,一种是私有变量,大家都知道,私有变量在函数外部是不可以使用的,但是在js中利用闭包就可以做到。先看个例子:
function aaa(){
var a=12;//函数aaa的私有变量
return function(){
console.log(a);
}
}
var bbb=aaa();
bbb();//输出12
在外部调用bbb函数的时候输出了a这个私有变量,这样做可以避免变量的全局污染。
第二,可以使某个变量长期存在于内存中。
function aaa(){
var a = 1;
a++;
console.log(a);
}
aaa(); //2
aaa(); //2
上面这个函数每次调用的时候都是输出2,下面这个函数就可以让一个变量长期存在。
function aaa(){
var a=1;
return function(){
a++;
console.log(a);
}
var bbb=aaa();
bbb();//2
bbb();//3
第三,在循环中直接找到对应元素的索引。
比如给一组li添加点击事件,并输出相应的索引,代码如下:
var oLi=document.getElementsByTagName(‘li‘);
for(var i=0;i<oLi.length;i++){
/*
oLi[i].onclick=function(){
alert(i);
}
;*/ //这样是不能正确取出i值的,会全部输出oLi的长度
oLi[i].onclick=(function(i){
return function(){
alert(i);
}
})(i); //这样就可以正确输出了
}
要理解上面的函数,首先要看懂这个函数:
(function(){
alert(1);
})();
在这里会输出数字1,这种()();的方式会使前面的括号中的内容被立即执行,而后一个括号中可以传递参数。
现在我们来解释上面给li添加点击事件的函数,当用第一种方式的时候,由于js是单线程的,所以在点击事件未触发之前for循环已经结束了,而i已经所以在点击的时候输出的实际上是最后一个i,第二种方法用到()();方式,这样,在给每个li添加点击事件的时候实际上是给每个li创建了点击事件,而i也相应的绑定到了对应的事件中,所以可以正确的输出。
标签:
原文地址:http://www.cnblogs.com/Upton/p/4694705.html