JS闭包

六月ゝ 毕业季﹏ 提交于 2020-02-26 08:00:37

JS闭包

了解什么是闭包

先来一段代码,根据代码分析能更容易理解:

function a() {
      var num = '我是函数a的变量num';
      return function b() {
        console.log(num);
      }
    }
    var res = a();
    res();

从函数a上看:有一个函数a,在函数a的内部,返回了一个函数b,而函数是一个复杂数据类型,即在一个函数内部,返回了一个复杂数据类型。

从函数b上看:函数b中,访问着函数a的里面的变量(数据),也就是在一个被返回的函数里,有一个外部作用域的变量。

从函数a外部看:有一个变量res,引用了函数a,但是由于函数a内部存在有一个返回值函数b,则,这个变量,相当于在引用了函数b(调用函数a,执行结果就是函数b)。

代码上的分析:

function a() {

      //这个 num 变量就是函数 a 的变量
      var num = '我是函数a的变量num';
      
      return function b() {
      
      //这里在后台输出的num,是函数a的变量
        console.log(num);
      }
    }
    
    //res 所接收到的是 a 函数执行以后的返回值
    //而这个返回值就是函数 a 内部返回的一个复杂数据类型(函数b)
    //这个时候,触发了一个不会销毁的函数空间
    //导致执行函数a的执行空间不会被销毁
    var res = a();

    //接下来可以随时调用这个变量res
    //res 是一个 函数a 里面返回的 函数b
    //res所输出的,就是函数a内部的变量num
    res();
	
	/*
	补充(大概说明):
		什么是一个不会销毁的执行空间:
			当一个函数内部,返回的是一个复杂数据类型,
			并且函数外部存在一个变量,接收这个复杂数据类型的时候,
			这个函数的执行空间不会被销毁。
	*/

JS的闭包,就是能够读取其他函数内部变量的函数。

JS闭包的生成条件

1、在函数 a 内部直接或者间接返回一个函数 b;
2、b 函数内部使用着 b 函数的变量(数据);
3、a 函数外部有一个变量接受着函数 b。

在所形成的一个不会销毁的函数空间,我们管这个空间叫做闭包空间,把函数a里面返回的函数b, 叫做函数a 的闭包函数

JS闭包的特点

优:
1、存在的变量能够长期存储在内存中(延长变量生命周期);
2、利用闭包函数,可以访问函数的变量(数据);
3、避免变量不会被外界所访问。
缺:
1、增加内存的的使用量;
      因为在内存空间中,一直存在着一个不会销毁的空间,会导致内存被占用
2、容易造成内存泄漏
      当内容被占用过多时,会导致内存溢出,也就是内存泄漏

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!