JS闭包的理解

JS闭包的理解闭包的简介 闭包就是能够读取其他函数内部变量的函数 只有函数内部的子函数才能读取局部变量 在本质上 闭包是函数内部和函数外部连接起来的桥梁 闭包的定义 如果在一个内部函数里 对在外部作用域 但不是全局作用域 的变量进行引用 那么内部函数就被认为是闭包 closure 闭包的特点 可以读取自身函数外部的变量 沿着作用域链寻找 先从自身开始查找 如果自身没有才会继续往上级查找 自身如果拥

闭包的简介:

闭包就是能够读取其他函数内部变量的函数。只有函数内部的子函数才能读取局部变量,在本质上,闭包是函数内部和函数外部连接起来的桥梁。

当函数可以记住并访问所在词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 – – 出自《你不知道的JavaScript(上卷)》

闭包的定义:

如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

闭包的特点:

  1. 可以读取自身函数外部的变量(沿着作用域链寻找)先从自身开始查找,如果自身没有才会继续往上级查找,自身如果拥有将直接调用。(哪个离的最近就用哪一个)
  2. 延长内部变量的生命周期
  3. 函数b嵌套在函数a内部
  4. 函数a返回函数b

闭包的作用:

在函数a执行完并返回后,闭包使得JavaScript的垃圾回收机制不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量,闭包需要循序渐进的过程。

闭包的构成:

闭包由俩个部分构成:

  • 函数
  • 以及创建该函数的环境

应用场景:

  1. 保护函数内的变量安全。函数a中只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
  2. 在内存中维持一个变量

demo:

var test = (function() { 
    var a = 1; function add(val){ 
    a += val; } return { 
    add1() { 
    add(1); }, add2() { 
    add(2); }, result() { 
    return a; } } })(); 

拓展:

简单demo:

var num = 6; function outer() { 
    var num = 1; function inner() { 
    var n = 2; alert(n + num); } return inner } const test = outer(); test(); 

在这里插入图片描述
结果与我们想的一样,是3。

用闭包实现一个缓存函数

function memo() { 
    const obj = { 
   }; return (a, b) => { 
    if (obj[`${ 
     a}-${ 
     b}`]) return obj[`${ 
     a}-${ 
     b}`]; return obj[`${ 
     a}-${ 
     b}`] = a + b; } } 

闭包的缺点:

滥用闭包会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数。

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199252.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午1:31
下一篇 2026年3月26日 下午1:31


相关推荐

  • 二叉树层序遍历(C语言)[通俗易懂]

    二叉树层序遍历(C语言)[通俗易懂]二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。如下:层序遍历结果:ABCDEFG基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。自然,本题还可以用数组来实现。代码:#include<stdio.h>#include<stdlib.h>#defineQueueMax100typedefstructNode{chardata;structNode*

    2022年5月22日
    47
  • idea全文搜索快捷键_idea搜索方法快捷键

    idea全文搜索快捷键_idea搜索方法快捷键1、Ctrl+N按名字搜索类相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件,就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配,而且如果能匹配的自己写的类,优先匹配自己写的类,甚至不是自己写的类也能搜索。2、Ctrl+Shift+N按文件名搜索文件同搜索类类似,只不过可以匹配所有类型的文件了。3、Ctrl+H查看类的继承关系,例如HashMap的父类是AbstractMap,子类则有一大堆。4、Ctrl+Alt+B查看

    2022年8月30日
    6
  • Spring Boot 调用豆包大模型如何开启联网搜索?

    Spring Boot 调用豆包大模型如何开启联网搜索?

    2026年3月12日
    3
  • 微信小程序解析富文本标签[通俗易懂]

    微信小程序解析富文本标签[通俗易懂]wxParse方法我踩雷了微信官方文档有个更为便捷的标签<rich-textnodes=”{{}}”></rich-text>

    2022年8月18日
    17
  • 利用iframe和location.hash实现跨域

    利用iframe和location.hash实现跨域原理是利用location.hash来进行传值。在url:http://a.com#helloword中的‘#helloworld’就是location.hash,改变hash并不会导致页面刷新,所以可以利用hash值来进行数据传递,当然数据容量是有限的。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html传递信息,cs1.html首先创建自动创建一个隐藏

    2022年7月16日
    26
  • C#FindWindowEx参数详解[通俗易懂]

    C#FindWindowEx参数详解[通俗易懂]FindWindowEx参数详解本函数的其他内容在网络上都比较多,这里主要说一下它的参数设置和搜索结果的区别。函数功能:在窗口列表中寻找与指定条件相符的第一个子窗口。该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。函数原型:HWNDFindWindowEx(HWNDh

    2022年6月1日
    142

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号