首页 > 其他分享 >闭包函数的理解

闭包函数的理解

时间:2023-02-09 19:33:44浏览次数:39  
标签:闭包 函数 作用域 内部 理解 内存 变量

1.前言(为什么要搞这么一个东西出来,即必要性是什么):

我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量

并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,

那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。

2.概念

闭包函数:声明在一个函数中的函数,叫做闭包函数。

闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

特点:

①函数嵌套函数

②函数内部可以引用函数外部的参数和变量

③参数和变量不会被垃圾回收机制回收

换言之特性为:

  让外部访问函数内部变量成为可能;

  局部变量会常驻在内存中;

  可以避免使用全局变量,防止全局变量污染;

  会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

闭包的创建:­­­

闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,互不干扰。闭包会发生内存泄漏,每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根指针给内部活动对象。

闭包内存泄漏为: key = value,key 被删除了 value 常驻内存中; 局部变量闭包升级版(中间引用的变量) => 自由变量;

使用场景:

使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念。

结论:闭包找到的是同一地址中父级函数中对应变量最终的值

最后总结一下闭包的好处与坏处

好处

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

坏处

①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

标签:闭包,函数,作用域,内部,理解,内存,变量
From: https://www.cnblogs.com/131362wsc/p/17106801.html

相关文章

  • kx00003-顺序表--清空和销毁函数
    一、顺序表结构定义#defineINIT_SIZE10 //顺序表初始容量typedefvoid(myOpFunType)(void*); //定义操作函数类型typedefintseqType; //定义顺序表元素类......
  • 【Excel】IF条件函数公式怎么用?
    版本Excel2019步骤点击插入函数打开文档,点击公式菜单下的插入函数。 双击选择IF函数在函数列表双击选择IF函数。输入条件测试值在第一个输入框输入条件......
  • 【js】数组:filter函数
    前言:在使用filter的时候,永远返回的是一个“被筛选后的”新数组  1、定义 filter() 用于过滤某些元素,如果有if判断,if中往往返回的是true或false(布尔值)2、使用fil......
  • 将二维数组作为函数参数
    今天本来正在写一个稀疏数组的代码,要写的内容很简单,创建一个11x11的数组,将其中两个位置分别赋值为1、2,其余位置为0。然后输出数组看一下是否赋值正确。正常是很简单的事情......
  • python3中,isinstance() 函数
    #isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。#返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实例:a=2prin......
  • 云函数模板
    1'usestrict';2exports.main=async(event,context)=>{3//JQL连接数据库4constdb=uniCloud.databaseForJQL({5event,6context7......
  • 一辆车帮你读懂python函数
     函数的概念:有一个超市,a要去买西,走一段距离,b去买东西走一段距离,c去买东西也走一段距离,于是就有了公交车,abc都可以搭这一趟公交车去超市买东西,这里的公交车就是函数。函......
  • 54.函数参数传递的三种方式
    #define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;//值传递voidswap(inta,intb){ inttmp=a; a=b; b=tmp;}//指针传递void......
  • JavaScript闭包有哪些表现形式?
    在真实的场景中,究竟在哪些地方能体现闭包的存在?1.返回一个函数functionf1(){vara=2;returnfunctionf2(){console.log(a);//2};};varnum=f1();num()......
  • C语言字符串操作函数汇总
    1.strcpy函数语法:strcpy(str1,str2)功能:将字符串str2复制到字符串str1中,并覆盖str1原始字符串,可以用来为字符串变量赋值。返回:str1注意:1.字符串str2会覆盖str1中的全部字......