【面试官】说说你对闭包的理解

说说你对闭包的理解

  • 闭包是什么
  • 闭包的三个特性
  • 优缺点
  • 应用场景
  • javascript的垃圾回收原理:
    • 通常情况下有两种实现方式
    • 垃圾回收原理的缺陷
    • GC优化策略

闭包是什么

  • 闭包就是能够读取其他函数内部变量的函数
  • 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域

闭包的三个特性

  • 函数内再嵌套函数
  • 内部函数可以引用外层的参数和变量
  • 参数和变量不会被垃圾回收机制回收

优缺点

  • 使用闭包主要是为了设计私有的方法和变量
  • 闭包的优点是可以避免全局变量的污染,让这些变量始终保持在内存中,可以读取函数内部的变量,还可以就是,能够实现封装和缓存等,私有成员的存在
  • 缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。消耗内存、不正当使用会造成内存溢出的问题
  • 在js中,函数即闭包,只有函数才会产生作用域的概念

应用场景

  • 场景一:采用函数引用方式的setTimeout调用(和click一样)
    原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。
function f1(a) {function f2() {console.log(a);}return f2;
}
var fun = f1(1);
setTimeout(fun,1000);//一秒之后打印出1
  • 场景二:沙箱模式可以将代码运行环境与外部环境隔离开来,防止互相干扰和污染。
  // 创建一个沙箱函数,接收一个配置对象作为参数function createSandbox(config) {// 在沙箱函数内部定义私有变量和方法var privateData = config.data;function privateMethod() {// 私有方法的实现}// 返回一个包含公共接口的对象return {// 公共方法publicMethod: function () {// 使用私有数据和私有方法进行业务逻辑处理console.log(privateData);privateMethod();}};}// 使用沙箱函数创建一个沙箱实例var sandbox = createSandbox({data: "私有数据"});// 调用沙箱实例中的公共方法sandbox.publicMethod();
  • 场景三
    封装私有变量  
    如下面代码:用js创建一个计数器
    function f1() {var sum = 0;var obj = {inc: function () {sum++;return sum;}};return obj;}let result = f1();console.log(result.inc(), '1');//1console.log(result.inc(), '2');//2console.log(result.inc(), '3');//3
function f1() {var sum = 0;function inc() {sum++;return sum}return inc;
}
let result = f1();
console.log(result(), '1');
console.log(result(), '2');
console.log(result(), '3');//3
function f1() {var sum = 0;function f2() {sum++;return f2;}//返回指定对象的原始值,若对象没有原始值,则将返回对象本身。f2.valueOf = function () {return sum;};f2.toString = function () {return sum + '';};return f2;
}
//执行函数f1,返回的是函数f2
console.log(+f1());//0
console.log(+f1()())//1
console.log(+f1()()())//2

javascript的垃圾回收原理:

Javascript具有自动垃圾回收机制(GC:Garbage Collecation)

  1. 在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收:
  2. 如果两个对象互相引用,而不再被第三者所引用,那么这两个互相引用的对象也会被回收。

通常情况下有两种实现方式

标记清除

  • js中最常用的垃圾回收方式就是标记清除。

当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。

引用计数

  • 跟踪记录每个值被引用的次数

当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。

垃圾回收原理的缺陷

和其他语言一样,javascript的垃圾回收机制策略也无法避免一个问题:自动垃圾回收机制时,停止响应其他操作,这是为了安全考虑,而Javascript的GC在100ms甚至以上,对一般的应用还好,但对于JS游戏,动画对连贯性要求比较高的应用,就麻烦了。这就是新引擎需要优化的点:避免GC造成的长时间停止响应。

GC优化策略

  • 分代回收(Generation GC)

这个和Java回收策略思想是一致的。目的是通过区分“临时”与“持久”对象;多回收“临时对象”区(young generation),少回收“持久对象”区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时

  • 增量GC

这个方案的思想很简单,就是每次处理一点,下次再处理一点,如此类推

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ClickHouse解决活动海量数据问题 | 京东云技术团队

1、背景 魔笛活动平台要记录每个活动的用户行为数据,帮助客服、运营、产品、研发等快速处理客诉、解决线上问题并进行相关数据分析和报警。可以预见到需要存储和分析海量数据,预估至少几十亿甚至上百亿的数据量,所以需要选择一款能存储海量数…

会议音响系统麦克风阵列波束形成算法C语言实现

一 应用麦克风阵列波束成形算法做的项目产品 二 麦克风波束形成技术应用领域? 麦克风波束形成技术是一种利用多个麦克风阵列来实现声音定向捕捉和增强的技术。通过对多个麦克风信号进行处理和合成,可以使麦克风系统在特定方向上具有更高的灵敏度和抑制非期望方向上的噪…

机器学习(13)--支持向量机

目录 一、支持向量机概述 二、Sklearn中的SVM概述 三、线性SVM损失函数 四、sklearn中进行可视化 1、导入模块 2、实例化数据集,可视化 3、网格点制作 4、建立模型并绘制决策边 目录 一、支持向量机概述 二、Sklearn中的SVM概述 三、线性SVM损失函数 四…

机器学习技术(三)——机器学习实践案例总体流程

机器学习实践案例总体流程 文章目录 机器学习实践案例总体流程一、引言二、案例1、决策树对鸢尾花分类1.数据来源2.数据导入及描述3.数据划分与特征处理4.建模预测 2、各类回归波士顿房价预测1.案例数据2.导入所需的包和数据集3.载入数据集,查看数据属性&#xff0c…

四个按键控制led的四种变化(按键控制led)(附源码)

文章目录 一、实验任务二、系统框图三、代码实现四、引脚分配五、总结 一、实验任务 使用开发板上的四个按键控制四个LED灯。按下不同的按键时,四个LED灯显示不同效果。本实验是在EP4CE6F17C8开发板上实现,仿真请用modelsim Altera 二、系统框图 三、代…

揭秘GPT-4;Adobe Firefly AI 扩大测试规模

🦉 AI新闻 🚀 Adobe Firefly AI 扩大测试规模,支持100多种语言的输入 摘要:Adobe宣布扩大测试规模,Adobe Firefly AI现在支持100多种语言的 prompts 输入。网页测试版Firefly已经扩充了罗马尼亚语等多种语言&#xf…

MacOS使用USB接口与IPhone进行Socket通信

演示效果如下: 开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB 克隆源码: git clone https://github.com/rsms/peertalk.git 克隆后打开peertalk然后启动xcode工程 先启动MacOS服务端工程,再启动iOS客户端工程 客户端 服务端

微信小程序安装和使用 Vant Weapp 组件库

微信小程序安装和使用 Vant Weapp 组件库 1. Vant Weapp 介绍2. Vant Weapp 的 安装2.1. 通过npm安装2.2. 构建npm2.3. 修改 app.json2.4. 修改 project.congfig.json2.5. 测试一下,使用Vant Weapp提供的组件 1. Vant Weapp 介绍 Vant 是一个轻量、可靠的移动端组件…

极智开发 | ubuntu交叉编译aarch64 boost

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 ubuntu交叉编译aarch64 boost。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接&#xf…

opencv -10 基础运算之 图像加权和(图像融合图像修复视频合成)

什么是图像加权和? 所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为: dst saturate(src1 𝛼 src2 𝛽 𝛾)式中,satu…

C# Linq 详解二

目录 概述 七、OrderBy 八、OrderByDescending 九、Skip 十、Take 十一、Any 十二、All C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Linq 详解二 1.OrderBy 2.OrderByDescending 3.Skip 4.Take 5.Any 6.All C#…

arm day2

汇编实现1到100的累加 .text .global _start_start:mov r0,#0loop:add r0,#1add r1,r0cmp r0,#100blne loopstop:b stop结果为0x13ba等于5050

python的魔法函数

一、介绍 在Python中,魔法函数是以双下划线__开头和结尾的特殊函数。它们在类定义中用于实现特定的行为,例如运算符重载、属性访问、迭代等。 以下是一些常见的Python魔法函数: __init__: 这是一个特殊的构造函数,在创建类的实例…

Web_php_include

代码审计 进入环境&#xff0c;根据题目的提示&#xff0c;本题考察文件包含漏洞 <?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) {$pagestr_replace("php://", "", $page); } incl…

解决Ruoyi单体版本集成Echarts多图表时在Tab模式下不展示问题

目录 背景 一、Tab拆分后无法展示 1、环境简介 2、原始报表功能说明 3、tab切分遇到的问题 二、问题分析及解决 1、问题分析 2、问题解决 3、初始化时图表渲染 4、Tab切换时重渲 总结 背景 最近在使用ruoyi的单体化版本进行Echarts多图表展示时遇到一个问题&#xff0c;r…

苍穹外卖day03——菜品管理业务代码开发

目录 公共字段自动填充——问题分析和实现思路 公共字段自动填充——代码实现(1) 公共字段自动填充——代码实现完善(2) 新增菜品——需求分析与设计 产品原型 ​编辑 接口设计 ​编辑 数据库设计 新增菜品——代码开发1(文件上传接口) 配置文件 Controller层代码 前后…

Net HTTP 概述

Net HTTP 概述 状态码字段Get/Post HTTP (HyperText Transfer Protocol) : 超文本传输协议 超文本 : 比文本更丰富传输 : 双方通信协议 : 双方的约定 状态码 200 : OK , 一切成功302 : 临时重定向 , 访问另一个 URL404 : 服务器不存在该 URL502 : 网关 , 代理错误503 : 当前…

Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增

01 线上服务器CPU飙升&#xff0c;如何定位到Java代码 解决这个问题的关键是要找到Java代码的位置。下面分享一下排查思路&#xff0c;以CentOS为例&#xff0c;总结为4步。 第1步&#xff0c;使用top命令找到占用CPU高的进程。 第2步&#xff0c;使用ps –mp命令找到进程下…

el-table合并单元格

1. 代码 <template><div><el-table border :span-method"arraySpanMethod" :data"tableData" style"width: 100%"><el-table-column prop"date" label"日期" width"180"></el-table-…

无线电音频-BPA600蓝牙协议分析仪名词解析

1 介绍 2 Baseband基带分析 (1)Delta 是什么含义? "Delta" 有多个含义,取决于上下文。以下是常见的几种含义: 希腊字母:Delta&#x