zoukankan      html  css  js  c++  java
  • javascript-闭包学习笔记

    以前讲闭包,只能死记硬背,不能理解,这几天看到了阮一峰老师的闭包笔记,对闭包加深了理解,做个笔记

    一、变量的作用域

    变量作用域:全局变量和局部变量。
    javascript比较特殊,函数内部可以直接读取全局变量。
    var n = 90;
    function f1() {
      alert(n)
    }
    f1(); // 90
     
    但是另一方面,函数外部自然是无法读取函数内的局部变量。
    function f1() {
      var n = 90;
    }
    alert(n); // error
    注意:这边在函数内部声明变量的时候,一定要用const|let|var命令,否则就是声明一个全局变量。
     
    二、如何从外部读取局部变量
    有时候我们需要得到函数内的局部变量,但是前面说过,正常情况下,函数外部是无法读取函数内的局部变量,只有通过变通方法才能实现。
    那就是在函数内部,在定义一个函数。
    function f1() {
      var n = 90;
    
      function f2() {
        alert(n);
      }
    }
     
    思考上述代码,函数f2是在f1中的,此时f1中的函数,对f2都是可见的,既然f2可以读取f1的局部变量,那么只要把f2作为返回值,我们就可以在外部读取它的内部变量。
    function f1() {
      var n = 999;
      function f2() {
        alert(n);
      }
    
      return f2;
    }
    
    var result = f1();
    result(); // 999

    三、闭包的概念

    上面的f2函数,就是闭包,闭包是一个函数,能够读取其他函数内部变量的函数,闭包可以是函数内部和函数外部连接的一座桥梁。

     
    四、闭包的用途
    闭包最大的两个用途:
    1、可以读取到函数内部的变量。
    2、就是让这些变量的值始终保持在内存中。
     
    function f1(){
    
        var n=999;
    
        nAdd=function(){n+=1}
    
        function f2(){
          alert(n);
        }
    
        return f2;
    
      }
    
      var result=f1();
    
      result(); // 999
    
      nAdd();
    
      result(); // 1000
    在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

    为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
     
     

    参考连接:https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

  • 相关阅读:
    hibernate常用配置
    hibernate快速入门
    【转】Struts2中json插件的使用
    【转】Struts2解决表单重复提交问题
    OGNL表示式使用和值栈
    Python就是为了方便生活,比如看VIP电影
    使用python进行面部合成,比PS好用多了
    Python黑科技,教你学会Django系统错误监控
    Python这么厉害的么?一次爬完整站小说
    Linux优化不知如何下手?那你的看看这篇文章了
  • 原文地址:https://www.cnblogs.com/yxfboke/p/12842834.html
Copyright © 2011-2022 走看看