【JS进阶】JS中的闭包

js闭包详细讲解 js闭包的详细讲解 立即下载

闭包

1.JS中的垃圾回收机制(GC)

函数中的局部变量会经历一个生命周期:

  1. 当我们定义一个变量时,会为它分配一个内存空间用来储存变量的值;
  2. 当我们读取或使用这个变量时,会使用它的内存空间;
  3. 使用完毕时会释放内存空间。

上面生命周期的最后一步,其实就是垃圾回收。而 JS 中存在自动的垃圾回收机制,即GC。

在 JS 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收。

如果两个对象互相引用,而不再被第三者所引用,那么这两个互相引用的对象也会被回收。

通常对于某个变量,我们不需要使用之后,就可以把它的值设置为 null ,这样垃圾回收器就会回收这个变量占用的空间了!

一般来说,当一个函数执行完毕,那么这个局部作用域内的变量就没有存在的必要了,它的内存空间就会释放。

但是实际上有一种情况可以阻止这一进程,那就是 — 闭包。

2.闭包的概念

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

看下面这个例子:

function foo() {
    var a = 2;
    
    // 函数bar() 的词法作用域能够访问foo() 的内部作用域。
    function bar() {
        console.log( a );
    }
    return bar;
}

var baz = foo();
baz(); // 2 —— 朋友,这就是闭包的效果。

// 在foo() 执行后,其返回值(也就是内部的bar() 函数)赋值给变量baz并调用baz()
// 实际上只是通过不同的标识符引用调用了内部的函数bar()。
// bar() 显然可以被正常执行,而且是在自己定义的词法作用域以外的地方执行了。

以上代码中,在foo() 执行后,通常会期待foo()的整个内部作用域都被销毁,因为我们知道引擎有垃圾回收器用来释放不再使用的内存空间。由于看上去foo()的内容不会再被使用,所以很自然地会考虑对其进行回收。

而闭包的“神奇”之处正是可以阻止这件事情的发生。事实上内部作用域依然存在,因此没有被回收。谁在使用这个内部作用域?原来是bar() 本身在使用。

拜bar() 所声明的位置所赐,它拥有涵盖foo()内部作用域的闭包,使得该作用域能够一直存活,以供bar() 在之后任何时间进行引用。bar() 依然持有对该作用域的引用,而这个引用就叫作闭包。

即:

  1. 函数在定义时的词法作用域以外的地方被调用时,闭包使得函数可以继续访问定义时的词法作用域。
  2. 无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。

3.闭包的特性和应用场景

3.1 闭包的特性
  • 被闭包函数访问的父级及以上的函数的局部变量(如范例中的局部变量 i )会一直存在于内存中,不会被JS的垃圾回收机制回收,即数据持久性。
  • 闭包函数实现了对其他函数内部变量的访问。(函数内部的变量对外是无法访问的,闭包通过这种变通的方法,实现了访问。)
3.2 闭包的应用场景
  • 模拟面向对象的代码风格 - 属性 + 方法
  • 使 setTimeOut 方法支持传参
  • 封装私有变量 - 闭包可以⽤来创建私有变量,还可以延⻓变量的⽣命周期。⽐如在函数内定义变量,然后get和set⽅法,这样在函数外部就可以通过get、set访问到内部的变量,就实现了一个私有变量。
  • 模拟块作用域
  • 实现迭代器
3.3 闭包的优缺点

优点:

  1. 可以减少全局变量的定义,避免全局变量的污染
  2. 能够读取函数内部的变量
  3. 在内存中维护一个变量,可以用做缓存

缺点:

  • 造成内存泄露:
    1. 闭包会使函数中的变量一直保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
    2. 解决方法 - 使用完变量后,手动将它赋值为null;
  • 闭包可能在父函数外部,改变父函数内部变量的值。
  • 造成性能损失:
    1. 由于闭包涉及跨作用域的访问,所以会导致性能损失。
    2. 解决方法 - 通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

4.循环与闭包

…

ardupilot BMI088加速度陀螺仪学习 本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出 阅读详情

相关推荐

Ubuntu开机卡在BusyBox?3种方法快速修复initramfs错误(附详细命令)

本文详细介绍了Ubuntu开机卡在BusyBox并出现initramfs错误的3种修复方法,包括使用fsck检查文件系统、调整BIOS/UEFI存储设置以及修改GRUB内核参数。针对常见的文件系统错误和根设备无法找到问题,提供了具体的命令行操作步骤和实用技巧,帮助用户快速恢复系统启动。

milk8的博客 784

JavaScript中的闭包

JavaScript中的闭包

qq_44482048的博客 6424

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3987

JS中的闭包

闭包

web$-小白 9207

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2748

关于JavaScript的闭包

关于JavaScript的闭包

太阳与星辰的博客 1067

手把手教你用OpenRouter免费模型:从DeepSeek V3.1到Llama 3.3的实战指南

本文详细介绍了如何利用OpenRouter平台免费接入DeepSeek V3.1、Llama 3.3等53个AI模型,提供从账号注册到实战应用的完整指南。通过文本摘要、客服对话生成和代码生成等具体案例,帮助开发者高效利用免费模型资源,提升AI应用开发效率。

weixin_29258297的博客 3554

闭包函数的理解

function fn() { return function () { //s; console.log("hello") return function () { //s1 console.log("world") } } ...

anhumi4350的博客 863

逆向拆解dy接口a_bogus 1.0.1.19版本核心算法(纯算版)第二部分

本文深入解析了dy接口a_bogus 1.0.1.19版本的核心算法,重点介绍了逆向分析的基础方法论、魔改Base64编码识别与还原、随机数生成与位运算解析等关键技术。通过详细的代码示例和实用技巧,帮助开发者掌握逆向工程中的关键步骤,特别是针对a_bogus参数的生成逻辑和混淆处理。

weixin_29288313的博客 408

(11-3-01 )

以太坊(Ethereum)是一种基于区块链技术的开源平台和加密货币。它于2015年由Vitalik Buterin和Gavin Wood等开发者创建,并成为比特币之后最受欢迎的加密货币之一。以太坊不仅支持加密货币交易,还为开发者和企业提供了构建去中心化应用程序的强大工具。在本节的内容中,将实型一个完整的机器学习模型项目,智能检测出以太坊区块链中的非法账户。从问题定义到模型建立和评估,再到最终的总结和建议。本实例突出了处理类别不平衡问题的重要性,并展示了如何使用多种机器学习算法来解决实际问题。此外,通过数据可

码农三叔 2170

js 【详解】闭包

如果一个函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包。

朝阳39的博客 3万+

2024 全国大学生新质生产力大赛 B:金融违规交易的大数据分析 问题四思路代码

问题四:请分析附件中所有的指标数据,选取合适的指标,建立“金融违规 洗钱交易的预测模型”,并选取合适的训练集和测试集,计算预测模型的准确率。 为了提前识别并预测金融违规洗钱的交易事件,请基于你们团队数据分析的结果, 分别给公安部门和银行机构提出你们的建议。

YOLO 375

js 点击闭包_【JS进阶】Javascript 闭包与Promise的碰撞

最近遇到一个比较有意思的题目,解决之后深入地思考了一下。整理整理我在其中的收获,写个文章分享给大家。一等公民进入正题之前再聊聊一个话题 —— JavaScript 的一等公民在 JavaScript 这门语言中,一等公民不仅包含了 变量,对象 等这些名词性的语法,更重要的是 函数 也是一等公民!因此:函数也可以被当做参数来传递函数也可以作为函数的返回值函数也可以被赋值到某个变量函数也动态地先定义(...

weixin_39610724的博客 155

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JavaScript - js进阶 - 闭包

闭包 概念 在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),只要出现引用了外部变量的函数,那么这个现象就叫做闭包 作用 让数据变得更加的安全 优化代码 函数内返回了另外一个函数 1. 闭包概念 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> &

Henry_ID的博客 288

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JS进阶】Javascript 闭包与Promise的碰撞

JS进阶】Javascript 闭包与Promise的碰撞@TOC 转载地址—链接地址: 添加链接描述

qq_36571836的博客 190

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【JS进阶】JavaScript内存管理和闭包

□这个算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对于哪些没有引用到的对象,就认为是不可用的对象;□标记清除的核心思路是可达性(Reachability)□这个算法可以很好的解决循环引用的问题;

ZhangYu_010228的博客 467

JavaScript进阶:作用域与闭包实战

规定变量可访问的范围,离开特定范围则无法访问,分为全局作用域和局部作用域。

qq_32936241的博客 651

JavaScript 函数进阶、闭包以及递归

我要做一个会思考的女孩!

m0_60273757的博客 1554

JS进阶 - 什么是闭包

闭包 对闭包的理解 闭包就是能够读取其他函数内部变量的函数 定义在一个函数内部的函数 闭包就是将函数内部和函数外部连接起来的一座桥梁 举个栗子: // 例1   var n = 999;   function f1(){     alert(n);   }   f1(); // 999 // 例2   function f2(){     var n = 999;   }  ...

Jioho的博客 251

JS进阶(三)(函数进阶,apply,闭包...等)

--------------记录自JS高级视频中的学习笔记包括了函数进阶,apply,call,bind方法的使用,闭包,递归,浅拷贝与深拷贝,沙箱. 函数进阶 创建函数的两种方式: 函数声明:function f1(){ console.log("函数声明"); } f1(); 复制代码 函数声明如果放在if-else语句中,在IE8中会出错(函数声明会被提升) 函数表达式:va...

weixin_34061042的博客 175

JavaScript进阶系列 - 闭包

我的博客仓库 this, call, apply 和 bind 以及箭头函数 用来放一些我看的书籍和学习的记录,欢迎点赞和讨论。 闭包(Closures) 在了解闭包之前,有一些概念必须了解,这些是形成闭包的先决条件。 词法作用域 (lexical scoping) var age = 10; function Tom(){ var name = 'Tom'; function ...

weixin_34378922的博客 234

javascript的进阶闭包

javascript的进阶闭包 在js中的闭包是一个一直研究的话题,闭包的也是web进阶中的一个必须的手段,浏览器的垃圾回收机制会将不用的函数回收掉,可以说这样的功能是一把双刃剑,好处与坏处是同样存在的;而闭包就是解决回收的一种方法。 总结一下闭包特点 1、实现公有变量。 2、可以做缓存,存储结构。 3、可以实现封装,属性私有化。 4、模块化开发,防止污染全局变量。 闭包的常用模式 IIFE (f...

心化江水的博客 171

js button onclick 传参_JS基础进阶 闭包作用域和JS高阶编程技巧

关注“前端学苑” ,坚持每天进步一点点「~JS基础进阶~」* 学习进阶方式 ?基础知识要夯实;原理源码要深入;深度广度要扩展;简短的概括:1、闭包作用域2、闭包应用:循环事件绑定的解决方法3、全面分析let和var的区别4、JS高阶编程技巧 (闭包进阶应用)1)应用1:循环事件绑定或者循环操作中对于闭包的应用2)应用2:基于“闭包”实现早期的“模块化”思想3)应用3:惰性函数(思想)4...

weixin_39879674的博客 467

【js进阶】-闭包

闭包,一说起这个词,很多人觉得就很难理解,或者说很难记住,那是因为对于该词的解释版本太多了,导致你都不知道哪个是正确的解释 一、定义 从理论角度:闭包是指那些能够访问自由变量的函数,所以说所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域,所以从理论的角度,所有函数都算是闭包 从实践角度:以下函数才算是闭包: 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回) 在代码

Ronychen的博客 850

【javascript知识进阶】this和闭包

【javascript知识进阶】this和闭包

学习、分享 1736
上一篇: 【JS进阶】this指向
下一篇: 【JS进阶】JS的事件循环机制
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值