zoukankan      html  css  js  c++  java
  • 什么是闭包?闭包使用场景?有什么缺点?

    首先思考这样一个问题:如何从函数外部读取到函数内部的局部变量?

    正常情况下,这是办不到的!只有通过变通的方法才能实现。

    function f1(){
      var a=1;
        function f2(){
         console.log(a);
      }
    }

    在上面的代码中,f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。
    这就是Javascript语言特有的"链式作用域"结构:
    子对象会一级一级地向上寻找所有父对象的变量。
    既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们就可以在f1外部读取它的内部变量了

    function f1(){
      var a=1;
      function f2(){
        console.log(a); 
      }
      return f2;
    }
    var F=f1();
    F();  //1

    闭包概念说起来很抽象,我认为闭包就是一个可以访问其他函数作用域的函数,就如上面的代码所展示的

    闭包用途:

    读取函数内部的变量

    让变量一直保存在内存中,不会被垃圾回收机制回收

    function f1(){
      var a=1;
      Add=function(){a++}
     function f2(){
        console.log(a);
     }
     return f2;
    }
    var F=f1();
    F(); // 1
    Add();
    F(); // 2

    Add没有var定义,它会变为全局变量,所以我们可以直接在全局调用它,第一次调用F()后a没有被回收,调用Add()时是在a=1情况下a++

    由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

  • 相关阅读:
    dedecms列表页实现文档按权重weight排序
    DEDEcms5.7各个文件的作用与安全防御设置
    我的SEO笔记
    分析网站日志
    网页上链接的添加规范与标准
    解决引用bootstrap样式时遇到的冲突问题
    js滚动到指定位置导航栏固定顶部
    使用rem自适应屏幕
    SQL 操作结果集 -并集、差集、交集、结果集排序
    简洁的左右滑动式轮播图
  • 原文地址:https://www.cnblogs.com/cqweb/p/14185943.html
Copyright © 2011-2022 走看看