函数自执行,闭包,局部变量,内存回收

一:函数内变量都是有独立作用域的: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)
 }
 
原文地址:https://www.cnblogs.com/live-to-talk/p/13554921.html