JavaScript的回收机制

  • 浏览器自己做。
  • 全局作用域声明一个变量不会被回收,只有关闭浏览器之后才回收。
  • 在局部作用域里面,变量在函数体执行完之后,就会被回收。

    <script>
        function func(){
            var x = 1;
            console.log(x); // 变量x在函数执行完毕后,会被回收
        };
        func();             // 1
        console.log(x);     // x is not defined 
    </script>
    

闭包

  • 可以访问其他函数作用域里变量或者参数的函数(闭包会造成局部变量不被销毁)。

    <script>
        (function(){
             var x = 1;
             console.log(x)
         })();//这不是一个闭包,这只是一个函数表达式的自执行
        
         function fn(){
             var y = 2;
             return y;   //可以获取内部函数的变量,但不是闭包
         };
         var b = fn();
         console.log(b);
    
         var m = 1;
         function func1(){
             var m =10;
             return function(){
                 m++;
                 console.log(m);
             }
         }
         var n = func1();
         n();        // 11
    </script>
    
  • 创建闭包:一个函数里面嵌套一个函数,内部函数引用外部函数的变量或者参数

    <div>11</div>
    <div>22</div>
    <div>33</div>
    <div>44</div>
    <div>55</div>
    
    <script>
        var boxes=  document.getElementsByTagName("div");
        len = boxes.length;
    
        // 创建闭包需要两个函数
        for(var i = 0; i < len; i++){
           
            // 闭包写法一
            func1(i);
            function func1(index){
                boxes[index].onclick = function(){
                    console.log(index);
                }
            }
    
            // 闭包写法二
            (function(index){
                boxes[index].onclick = function(){
                    console.log(index);
                }
            })(i)   // 自执行中带参数           
        }
    </script>

豆爹
6 声望0 粉丝