zoukankan      html  css  js  c++  java
  • 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执行效率,甚至造成内存溢出的。

  • 相关阅读:
    小强的HTML5移动开发之路(1)——HTML介绍
    HTML移动开发参考
    EBS R12 LOG files 位置
    ORACLE收集统计信息
    ORACLE sid,pid,spid总结
    How To Get Log, Trace Files In OA Framework Pages And Concurrent Request Programs
    XMPP系列(五)---文件传输
    XMPP系列(四)---发送和接收文字消息,获取历史消息功能
    iOS下如何获取一个类的所有子类
    是时候抛弃Postman了,试试 VS Code 自带神器插件
  • 原文地址:https://www.cnblogs.com/zenghong/p/4089961.html
Copyright © 2011-2022 走看看