闭包的理解及应用

  • Post author:
  • Post category:其他




1、闭包的含义

闭包 :


指一个定义在函数内部并有权访问此函数作用域的变量的函数


MDN官方解释的闭包:


一个函数和对其周围状态(语法环境)的引用捆绑在一起(或者说是函数被引用包围),这样的组合就是闭包。

看得懂这含义吗?看不懂没关系看下面代码:

 function f1(){
     var x=2;
     function f2(){
         console.log(x);  //输出 2
     }
     f2();
 }

// 在上面代码中 f2函数 就是一个闭包。f2函数可以访问 f1函数作用域中的变量 x 。

再问看得懂上面闭包的含义了吗?看不懂没关系,自己去把什么是函数及什么是作用域搞清楚再来QAQ。

当然上面的代码可以变变形,如下:

//当然在变形前先了解下(函数的引用)和(匿名函数)

//函数引用:在我们调用函数时,首先会写函数引用(即 f1,此引用储存在栈中,存放的有引用和指向堆中的地址),然后再写 f1()执行(这时引擎会根据栈中获得的f1函数的地址指针,再从堆内存中取得所需的数据)

//匿名函数:没有函数名的函数,例如:function(){ ...},常用于闭包
function f1(){
    var x=2;
    return function(){
        console.log(x);
    }
}
 var func=f1();
 func();  //输出 2

// 上面 f1()的值就是里面匿名函数的引用,把引用值赋给func,然后func()就执行了匿名函数(这里的匿名函数就是闭包)

如果你需要要给 里面的匿名函数 添加一些逻辑或参数 并返回结果 可以这样写:

function f1(){
    var x=2;
    return function(y){
       return x+y;
    }
}
 var func=f1();
 var func2=func(3);
 console.log(func2); //输出 5



2、闭包的作用

作用:

一个是可以读取函数内部的变量,另一个是让这些变量的值始终保存在内存中



为什么说闭包访问的外部变量可以始终保存在内存中?

我的理解是结合前面说到的函数引用,

每创建一个新的函数就会在堆中开辟一个新的内存空间



那么在闭包内 访问外部变量时会复制一个变量地址 存储到闭包这块内存中

(闭包里有变量的引用时会形成不被销毁的栈内存,把一些值保存下来),由此就造成当外部函数执行完了却影响不到保存在闭包内的变量

然后闭包的内存空间得到释放时,这个变量才会被当作垃圾回收删除。(关于变量何时被垃圾回收机制回收,可以说是所有作用域都没有引用它时,才会被回收 )

特殊的闭包写法:let ss=(functuion(){…})( );



3、闭包的应用场景

1、防抖、节流

2、控制访问权限,模拟私有方法,数据隐藏

3、公有方法调整字号

4、实现多个定时器独立



版权声明:本文为qq_44761755原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。