微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

闭包closure的概念

闭包

简单的说闭包就是指能够读取其它函数内部变量的函数

  1. js的变量作用域

    • 执行环境

      **执行环境**是js里的重要概念,定义了变量或者函数有权访问的其他数据,每个执行环境都有一个与之相关联的变量**对象**。每个函数都有自己的执行环境。当执行流进入一个函数时,函数的执行环境就会被推入一个环境栈中,在函数执行之后再将其弹出。全局执行环境是最外围一个执行环境
    • 作用域链

      代码一个环境中执行时,会创建变量对象的一个**作用域链**。作用域链的作用是保证变量和函数的有序访问。当前执行环境的变量对象中如果找不到某个变量或者函数的标识符,就会沿着作用于链一级一级回溯,直到找到该标识符或者到达全局执行环境
      

      简单的说,就是内部函数里的变量优先级高,内部函数有权访问外部函数内的变量或者函数,而外部函数不能访问内部函数的变量或者函数

  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就是一个闭包,实现了对函数内变量的访问。而且f1的内部变量一直存在于内存中,并没有随着f1的调用后清除。

  3. 使用闭包的优缺点
    通过以上例子也看一看出闭包主要的用途

    • 读取函数内部的变量

    • 让这些变量的值始终保存在内存中

    但是使用闭包也意味着会将函数中所有该变量保存在内存中,对内存的消耗会加大。而且闭包会在父函数外部改变父函数内部变量,使用是应多加注意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐