理解闭包

Posted xu991377264

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解闭包相关的知识,希望对你有一定的参考价值。

         闭包概念:闭包是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数)
         理解闭包之前首先要一定要理解作用域:全局变量  局部变量
         在JS中,函数内部可以读取全局变量;函数内 var 声明的变量为局部变量,省略 var 时是一个全局变量

        function a(){
            var i = 0;
            function b(){
                console.log(++i);
            }
            return b;
        }
        var c = a()// b
        c() //b()

      上下文执行顺序:

            技术分享图片

           特点: 1、 函数b是函数a内嵌套的
                      2、 函数a需要返回函数b
             用途:   1、可以读取函数内部的局部变量
                           2、让变量i的值保存在内存中

        function f1(){
            var n = 999;

            nAdd =function(){
                n=n+1;
            }

            function f2(){
                console.log(n);
            }
            return f2;
        }
        var rs=f1();//f2
        rs();//f2()---> 9999
        nAdd();//n=1000;
        rs();//1000

      闭包的优缺点
                优点:有利于封装,可以访问局部变量
                缺点:内存占用浪费i,造成内存泄漏

 

   var a=111;  
    function test(){
        alert(a);//undefined
        var a=11;
        function subTest(){
            alert(a);
        }
        return subTest;
    }
    test()();//11

解析:
           当函数中存在同样名字的局部变量时,就不会访问函数外的全局变量,这里函数中声明了var a = 11;即:函数中的局部变量。

           所有当第一次输出是就不在访问函数外的var =    111;这个变量了。又按照js从上往下执行的脚本,输出第一个a的时候,还没有赋值11这个值,所以输出undefined。
          我们还可以通过变量的提升来理解
          变量提升:js中变量和函数声明会被提升到当前作用域的顶部。在变量在变量声明之前使用变量的值是undefined。

      当函数中存在同样名字的局部变量时,就不会访问函数外的局部变量。如下例子:

    var j=5;
    function fn1(){
            var j = 0;
            function fn2(){
                console.log(++j);
            }
            return fn2;
        }
        var cs = a()// fn2
        cs() //fn2()---> 1











以上是关于理解闭包的主要内容,如果未能解决你的问题,请参考以下文章

javascript 匿名函数及闭包----转载

(原创)JS闭包看代码理解

一段代码理解闭包

python中对 函数 闭包 的理解

理解Python中的闭包

JS闭包的概念