• L--js闭包


    简介

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

    闭包的特性

    闭包有三个特性:

      1.函数嵌套函数

      2.函数内部可以应用外部的参数和变量

      3.参数和变量不会被垃圾机制回收

    闭包的定义及优缺点

    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量

    使用闭包的一个优点,也是他的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。

    全局变量在每个模块都可调用,这势必将是灾难性的的。(所以推荐使用私有的,封装的局部变量。)

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

    嵌套函数的闭包

    function test () {
        var a = 1;
        return function() {
            alert(a++);
        };
    }
    var fun = test();
    fun(); //1执行后 a++,然后a还在,还有指向a的引用
    fun(); //2
    fun = null; //指向a的引用消失,a被js垃圾机制回收

    闭包会使变量始终保存在内存中,如果使用不当会增大内存消耗。

    javascript的垃圾回收原理

    1.在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收;

    2.如果两个对象互相引用,而不再被第三者引用,那么这两个互相引用的对象也会被回收(IE的垃圾回收机制稍有不同)。

    使用闭包的好处

      1.希望一个变量长期驻扎在内存中

      2.避免全局变量的污染

      3.私有成员的存在

    一.全局变量的累加

    <script type="text/javascript">
        var a = 1;
        function test() {
            a++;
            alert(a);
        }
        test(); //2
        test(); //3
    </script>

    二.局部变量

    <script type="text/javascript">
        function test() {
            var a = 1;
            a++;
            alert(a);
        }
        test(); //2
        test(); //2
    </script>
    //Question:那么怎么才能做到变量a即是局部变量有可以累加呢?

    三.局部变量的累加

    <script type="text/javascript">
        var x = 10;
        function outer() {
            return function() {
                x++;
                alert(x);
            }
        }
        var y = outer(); //外部函数赋给变量y
        y();             //y函数第一次调用,结果为11
        y();             //y函数第二次调用,结果为12           
    </script>

    函数声明与函数表达式

    在js中可以通过关键字function来声明一个函数:

    <script type="text/javascript">
        function test() {
            alert("ok");
        }
        test();
    </script>

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

    <script type="text/javascript">
        (function () {
            alert("ok");
        })();  //自执行函数,不必写函数名
    </script>

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

    <script type="text/javascript">
        var test = (function() {
            var a = 1;
            return function() {
                a++;
                alert(a);
            }
        })();
        test(); //2
        test(); //3
    </script>

    五.私有成员的存在

    <script type="text/javascript">
        var test = (function() {
            var a = 1;
            function test1 () {
                a++;
                alert(a);
            }
            function test2 () {
                a++;
                alert(a);
            }
            return {               //json结构
                b: test1,
                c: test2
            }
        })()
        test.b(); //2
        test.c(); //3
    </script>

    六.使用匿名函数实现累加

    <script type="text/javascript">
        function test() {
            var age = 100;
            return function () {
                age++;
                return age;
            }
        }
        var b = test();
        alert(b());
        alert(b());
        alert(b());
        alert(b);  /*function () {
                        age++;
                        return age;
                   }*/
    
        b = null; //解除引用,等待GC回收
    </script>
    //过度使用闭包会导致性能下降。函数里放匿名函数,则产生了闭包
  • 相关阅读:
    工程模式--基于Java多态性实现
    使用IDEA导入打开Web项目
    基于字典树实现的O(n)排序
    牛客挑战赛39 E 牛牛与序列题解
    牛客练习赛61 F苹果树题解
    Treepath 题解
    Running Median 题解
    Xorto 题解
    NC201400 树学题解
    [Accumulation Degree]题解
  • 原文地址:https://www.cnblogs.com/guDouMaoNing/p/4396085.html
Copyright © 2020-2023  润新知