for循环和闭包
今天记录for循环和闭包的使用:
for(var i = 0 ; i < lis.length ; i++) {
lis[i].onclick=function(i){
return function(){
console.log(i)
}
}(i);
}
在for循环里面执行闭包的时候,将循环体的代码储存在一个内存中,对应的i值也储存在了内存中(闭包不销毁变量)。事件点击的时候是执行return之后的函数,在执行的时候,因为作用域的原因,使用的是事件之后的函数中的i值,这个i值在循环的时候已经储存为了对应的值,因此一次事件执行取到的i值都不一样。
作用域的问题:
var i = 5;
function fn(){
var i = 2;
return function(){
console.log(i)
i++
}
}
var f = fn();
f(); >>>2
f(); >>>3
fn()(); >>>2
先找局部作用域中的,局部没有找上级,上级还没有,就一直往上级找,直到window(全局作用域)。
闭包的扩展:jQuery
jquery本身就是一个大的闭包。
1.$('div') 获取的是一个集合,但是这个集合中的每一项都可以执行对应的事件,并且有自己的索引值。
理解:当这个集合执行点击事件的时候形成了一个闭包,这个闭包里面有一个变量对应着div的下标,这个变量就是for循环时候对应的i值。