码迷,mamicode.com
首页 > 其他好文 > 详细

理解闭包

时间:2018-06-06 22:16:15      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:com   返回   img   变量提升   通过   nbsp   局部变量   内存占用   占用   

         闭包概念:闭包是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数)
         理解闭包之前首先要一定要理解作用域:全局变量  局部变量
         在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

理解闭包

标签:com   返回   img   变量提升   通过   nbsp   局部变量   内存占用   占用   

原文地址:https://www.cnblogs.com/xu991377264/p/9146756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!