Home  >  Q&A  >  body text

js闭包是什么?

checkcheck2859 days ago1125

reply all(3)I'll reply

  • 数据分析师

    数据分析师2017-09-30 23:38:28

    What is js closure? -PHP Chinese website Q&A-What is js closure? -PHP Chinese website Q&A

    Please watch and learn.

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2016-12-22 16:52:57

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    闭包有三个特性:

    1.函数嵌套函数
    2.函数内部可以引用外部的参数和变量
    3.参数和变量不会被垃圾回收机制回收
    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量

    使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。全局变量在每个模块都可调用,这势必将是灾难性的。

    所以推荐使用私有的,封装的局部变量。

    一般函数执行完毕后,局部活动对象就被销毁,,内存中仅仅保存全局作用域。但闭包的情况不同!

    嵌套函数的闭包:

    function aaa() { 
         var a = 1; 
         return function(){
          alert(a++)
         }; 
    }     
        var fun = aaa(); 
        fun();// 1 执行后 a++,,然后a还在~ 
        fun();// 2  
        fun = null;//a被回收!!

    以上输出结果为5;
    闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗。

    javascript的垃圾回收原理

    (1)、在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收;
    (2)、如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

    那么使用闭包有什么好处呢?使用闭包的好处是:

    1.希望一个变量长期驻扎在内存中
    2.避免全局变量的污染
    3.私有成员的存在
    一、全局变量的累加

    <script>
    var a = 1;
    function abc(){
        a++;
        alert(a);
    }
    abc();       //2
    abc();      //3
    </script>

    二、局部变量

    <script>
    function abc(){
        var a = 1;
        a++;
        alert(a);
    }
    abc();            //2
    abc();          //2
    </script>

    那么怎么才能做到变量a既是局部变量又可以累加呢?

    三、局部变量的累加(闭包所能做到的)

    <script>
    function outer(){
        var x=10;
        return function(){       //函数嵌套函数
            x++;
            alert(x);
        }
    }
    var y = outer();       //外部函数赋给变量y;
    y();         //y函数调用一次,结果为11
    y();        //y函数调用第二次,结果为12,实现了累加
    </script>

    js中的函数声明与函数表达式:
    在js中我们可以通过关键字function来声明一个函数:

    <script>
    function abc(){
        alert(123);
    }
    abc();
    </script>

    我们也可以通过一个"()"来将这个声明变成一个表达式:

    <script>
    (function (){
        alert(123);
    })();          //然后通过()直接调用前面的表达式即可,因此函数可以不必写名字;
    </script>

    四、模块化代码,减少全局变量的污染

    <script>
    var abc = (function(){   //abc为外部匿名函数的返回值
        var a = 1;
        return function(){
            a++;
            alert(a);
        }
    })();
    abc();  //2 ;调用一次abc函数,其实是调用里面内部函数的返回值  
    abc();  //3
    </script>

    五、私有成员的存在

    <script>
    var aaa = (function(){
        var a = 1;
        function bbb(){
            a++;
            alert(a);
        }
        function ccc(){
            a++;
            alert(a);
        }
        return {
            b:bbb,       //json结构
            c:ccc
        }
    })();
    aaa.b();   //2
    aaa.c()   //3
    </script>

    具体可以参考一下网址:http://www.php.cn/js-tutorial-11226.html


    reply
    0
  • 迷茫

    迷茫2016-12-22 16:24:57

     “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

     相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。

        function a(){
          var i=0;
          function b(){
            alert(++i);
          }
          return b;
        }
        var c = a();
        c();

    这段代码有两个特点:
        函数b嵌套在函数a内部;
        函数a返回函数b。
    这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
    当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

    reply
    1
  • Cancelreply