• JS闭包理解


      接触JS很久了,一直对于闭包的概念不理解,因为平时很少会用到,所以找了一下资料看了一下,简单记一下笔记,不对之处望指正。

    参考原文:http://www.jb51.net/article/24101.htm

      先来看一个简单列子:

      function f1(){

          var v1=1;
     
          function f2(){
     
            v1++;
           return v1;
        }
        return f2;
     
      }
      var f1pro=f1();
      alert(f1pro());//-----2
      alert(f1pro());//------3

      对输出结果进行分析,如果我们忽略F2函数部分,那么我们会很容易判断为两次输出都是2,原因是因为v1是f1函数的局部变量,局部变量是会在函数调用结束以后被GC所自动回收的,所以第二次f1函数的调用结果与第一次f1函数的调用结果是没有关系的。

      但是万万没想到的是,第二次结果是3! 为什么呢?  看上去v1被升级成为了全局变量。   其实事实和这种猜想是有所差别的。 事实上f2这个内部函数就是我们所说的闭包,而闭包的作用,有2个:1、访问函数内部的局部变量。2、将使用到的局部变量的值保存在内存中。 第一个很好理解,将函数看成一个class的话,就相当于类函数访问到类变量,理所应当。而输出结果为3,原因就在于f1是f2的父函数,而f2被赋给了一个全局变量(f1pro,因为f1返回的是f2函数,所以f1pro其实是指向了f2函数),依赖关系即:f1pro--》f2---》f1,根据JS的GC回收原理(如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收),那么在全局变量f1pro被释放之前,f1和f2函数都不会被垃圾回收机制(garbage collection)回收。

      关于闭包的应用场景,我的理解是,当我需要让一个变量在函数外能够被操作,并且我不想这个变量暴露在外,被任何人任意操作的时候,就可以用到闭包,这个时候这个变量就只能按照闭包里函数的规则被获取和修改。

      值得注意的是,由于闭包绕过了GC处理,所以滥用的话,是会降低JS执行效率,甚至造成内存溢出的。

  • 相关阅读:
    【转】#pragma pack(push,1)与#pragma pack(1)的区别
    emwin 之变量定义位置
    【转】C语言字符串与数字相互转换
    【转】用emWin进度条控件做个表盘控件,效果不错
    emwin 之消息 WM_INIT_DIALOG
    emwin 之使用键盘数据发送函数的注意事项
    emwin 解决在A窗口上新建B窗口后‘只激活’B窗口问题
    【转】数学与编程——求余、取模运算及其性质
    hdu4831 Scenic Popularity(线段树)
    2014年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/zenghong/p/4089961.html
Copyright © 2020-2023  润新知