JS 闭包(Closure)
2018-09-17 本文已影响109人
Klart
参考阮一峰老师的JS 闭包
理解闭包前需要理解变量作用域、变量提升
先来看一下一道题目
<ul>
<li>选项1</li>
<li>选项2</li>
<li>选项3</li>
<li>选项4</li>
<li>选项5</li>
<li>选项6</li>
</ul>
/变量提升了,var item;var i;/
var item =document.querySelectorAll('li')
for (var i=0;i<item.length;i++){
items[i].onclick=function(){
console.log(i);
}
}
点击li依次打印出来什么?
答案:每次打印都是6
原因:变量提升了;i是全局变量;
那如何让它依次打印,12345呢;
因为i是全局变量,所以首先需要把i变为局部变量;
for (var i=0;i<item.length;i++){
var temp=function(j){
items[j].onclick=function(){
console.log(j);
}
}
temp(i)
}
这样打印的话就是依次打印123456
现在来说说闭包:
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
这样就是一个闭包;
闭包的作用就是暴露局部变量;