函数自执行,闭包,局部变量,内存回收
一:函数内变量都是有独立作用域的: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) }