一:函数内变量都是有独立作用域的:1函数外部获取不到内部的变量,2函数执行时浏览器给内部变量分配内存,执行完就会被回收机制回收。
function foo(c){
var num = c;
num++;
return num;
}
foo(5);//6
foo();//NAN 变量num使用完后就被回收了,所以这次执行num时重新定义的,没有参数所以NAN
//使用闭包:可使局部变量内存不被回收
function foo(c){
var num = c;
return function A(){
num++;
return num;
}
}
var b = foo(5);//A
b();//6 foo(5)执行返回的时一个函数赋给b,函数里用到了foo()函数里的变量num,所以这个变量内存不会被回收,
b();//7 再次执行b()的时候num是已存在的。
二:自执行函数节省全局变量,节省内存。
三:函数闭包为了打通函数内部与外部的桥梁
比如典型的循环绑定问题
<ul class="list">
<li class="bloc">1</li>
<li class="bloc">2</li>
<li class="bloc">3</li>
<li class="bloc">4</li>
<li class="bloc">5</li>
</ul>
var ali = document.querySelectorAll('ul.list li')
//var声明变量可以穿透作用域
for(var i = 0,l = ali.length;i < l;i++){
ali[i].onclick = function(){
console.log(i)
}
}
//利用自执行函数将每次循环的i值放到了对应的自执行函数里,该函数返回一个函数(闭包),返回的函数里使用了自执行函数里的参数j,该变量j就不会被回收,点击li打印的就是对应的闭包函数里的j值
for(var i = 0,l = ali.length;i < l;i++){
ali[i].onclick = (function(j){
return function(){
console.log(j)
}
})(i)
}