闭包及底层原理

news2024/10/5 18:43:39

1.闭包概念

定义:能够访问到其他函数作用域中的对象的函数,称为闭包

误区:闭包不是函数里面嵌套函数

2.闭包的两种写法

2.1函数嵌套写法

        // 闭包写法1: 内部嵌套函数
        function fn(){
            var a = 1;
            function fn2(){
                console.log(a+1);
            }
            fn2();
        }
        fn(); //2

2.2回调函数写法

    // 闭包写法2:回调函数写法 
        function fn(cb){
            var a = 1;
            return cb;
        }

        function callback(a){
            console.log(a+1);
        }
        fn(callback(2));//3

3.完整示例及分析

分析过程

  • 1. 全局执行上下文创建作用域链,作用域链包含了全局变量对象 [作用域链:[全局变量对象]]
  • 2. books函数调用时创建作用域链,具体操作为先复制全局的作用域,然后创建活动对象AO推入当前作用域的顶端 [作用域链:[book活动变量, 全局变量对象]],books函数执行完毕后当前作用域会被销毁
  • 3. bag函数调用创建作用域,首先复制上层作用域[作用域链:[book活动变量, 全局变量对象]],然后创建活动对象AO推入当前作用域的顶端[作用域链:[匿名函数func, book活动变量, 全局变量对象]],bag函数执行完毕后当前作用域会被销毁
        function books() {
            var book = '书包里面的书本'
            return function () {
                console.log(book)
            }
        }
        // 1.全局作用域中,创建books()函数前会创建一个全局对变量对象GLobal,放在Scopes中
        // 2.调用函数books()时,会先复制一份全局的GLobal对象,然后会创建一个局部作用域对象Local,然后函数作用域作为AO对象推入Local作用域顶端
        // 3.books函数执行完成后,Local作用域被销毁,只剩下Global全局作用域
        // 4.bag()函数调用时,首先会赋值一份上级books函数活动变量和全局的Global对象,然后创建一个自己的Local对象,再将自己的函数AO对象推如Local作用域链顶端
        // 5.bag()执行结束后,销毁自己的Local作用域
        var bag = books()
        bag()

1:全局对象中创建Global

2:函数books()调用时先赋值全局Global然后创建自己的Local。books()执行完成后销毁自己的Local

 

3:bag()调用时先复制一份books和Global的对象,然后创建自己的Local,bag调用完成后,销毁自己的Local

 

4.面试中常问到的问题

  • 1.如何在外部访问函数作用域内的变量,请手写一段代码进行验证
  • 2.闭包为什么会造成内存的泄露 (内存泄漏在哪个环节有问题)

5.面试题

function fn() {
    var arr = []
    for (var i = 0; i< 10; i++) {
        arr[i] = function() {
            return i
        }
    }
    return arr
}

var arr = fn()
console.log(arr[0]())

 以上代码输出10。循环时不断创建function()函数,返回i,因为var存在变量预编译,所以i最终会被覆盖为10。

解决:使用自执行函数将i放到私有作用域里面就不会被外部var的i 改变。

ES6中使用let也会有块级作用域

function fn() {
    var arr = []
    for (var i = 0; i< 10; i++) {
        (function(i){
            arr[i] = function() {
                return i
            }
        })(i)
    }
    return arr
}
var arr = fn()
console.log(arr[0]())

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

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

相关文章

在线兴趣教学类线上学习APP应用开发部署程序组建研发团队需要准备什么?

哈哈哈&#xff0c;同学们&#xff0c;我又来了&#xff0c;这个问题最近问的人有点多&#xff0c;但是说实话我也不知道&#xff0c;但是我还是总结了一下&#xff0c;毕竟我懂点代码的皮毛&#xff0c;同时我检索内容的时候&#xff0c;都是一些没有很新鲜的文案&#xff0c;…

Vue中调用组件使用kebab-case(短横线)命名法和使用大驼峰的区别

文章目录 Vue中调用组件使用kebab-case&#xff08;短横线&#xff09;命名法和使用大驼峰的区别1.解析官网手册说明2.什么是“字符串模版”&#xff0c;什么是“dom模版” Vue中调用组件使用kebab-case&#xff08;短横线&#xff09;命名法和使用大驼峰的区别 1.解析官网手册…

SSM - Springboot - MyBatis-Plus 全栈体系(二十五)

第五章 SSM 三、《任务列表案例》前端程序搭建和运行 1. 整合案例介绍和接口分析 1.1 案例功能预览 1.2 接口分析 1.2.1 学习计划分页查询 /* 需求说明查询全部数据页数据 请求urischedule/{pageSize}/{currentPage} 请求方式get 响应的json{"code":200,"f…

git pull and git fetch 到底有什么区别?

大家好这里是tony4geek 。 今天给大家介绍git pull and git fetch 有什么区别&#xff1f; 开发过程中大家肯定很多人都用到过git。获取代码有很多的git命令&#xff0c;最长用的命令是pull和fetch。那么问题来了他们之间到底有什么区别&#xff0c;该怎么使用呢&#xff1f;…

C语言之文件操作篇(2)

目录 文件状态指针 文件流 文件的顺序读写 fgetc fputc fgets fputs fscanf fprintf fread fwrite 今天接下来我们讲解文件读写函数。&#x1f197;&#x1f197;&#x1f197; 文件状态指针 文件状态指针也就是文件指示器。&#xff08;可以理解为光标&#xff09…

【U-Boot笔记整理】U-Boot 完全分析与移植

1. 大纲 大概内容如下&#xff1a; u-boot功能概述 目的功能细分 u-boot源码结构u-boot的配置、编译、连接过程 Makefile深入练习分析u-boot的Makefileu-boot可执行程序的组成 u-boot源码分析 SPL与第1阶段第2阶段核心&#xff1a;命令让u-boot的使用更加便利&#xff1a;env…

python图像检索系统设计与实现 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python图像检索系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c…

拼多多历史价格数据接口,拼多多商品历史价格接口,拼多多API接口

采集拼多多商品历史价格接口可以采用以下方式&#xff1a; 使用价格监控工具。价格监控工具是一种可以自动监测商品价格变化的工具&#xff0c;它可以帮助消费者快速采集拼多多商品价格信息&#xff0c;还可以提供价格变动趋势的图表分析&#xff0c;使消费者更好地掌握商品价…

Apache_Log4j2查找功能JNDI注入_CVE-2021-44228

Apache_Log4j2查找功能JNDI注入_CVE-2021-44228 文章目录 Apache_Log4j2查找功能JNDI注入_CVE-2021-442281 在线漏洞解读:2 环境搭建3 影响版本&#xff1a;4 漏洞复现4.1 访问页面4.2 poc漏洞验证 4.3 在dnslog获取个域名4.4 使用bp抓包进行分析4.5 通信成功&#xff0c;此处可…

【TA 挖坑04】薄膜干涉 镭射材质 matcap

镭射材质&#xff0c;相对物理的实现&#xff1f; 万物皆可镭射&#xff0c;个性吸睛的材质渲染技术 - 知乎 (zhihu.com) 薄膜干涉材质&#xff0c;matcap更trick的方法&#xff1f;matcapremap&#xff0c; MatCap原理介绍及应用 - 知乎 (zhihu.com) 庄懂的某节课也做了mat…

红队打靶:Nyx: 1打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;ssh私钥登录获取初始立足点 第三步&#xff1a;sudo gcc提权 番外篇&#xff1a;如何掉进web渗透的陷阱无法自拔 总结与思考 写在开头 我个人的打靶顺序是根据红队笔记大佬的视频顺序&#xff0…

最新最全Jmeter+InfluxDB1.8+Grafana可视化性能监控平台搭建(win11本地)

本文前置条件&#xff1a; 1.Jmeter自行部署好&#xff0c;且版本最好要5.4以上&#xff1b; 2.目前InfluxDB最新是V2版本&#xff0c;但与Grafana兼容不太好&#xff0c;且和V1版本的配置连接不一样&#xff0c;本文是InfluxDB1.8版本&#xff1b; 3.介绍的是WIN11本地部署…

《PyTorch深度学习实践》第二讲 线性模型 课后练习

《PyTorch深度学习实践》第二讲 线性模型 课后练习 问题描述代码实现实现效果 问题描述 代码实现 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 假设函数为 y 2x 1 x_data [1.0, 2.0, 3.0] y_data [3.0, 5.0, 7.0]# 定义…

【100天精通Python】Day70:Python可视化_绘制不同类型的雷达图,示例+代码

目录 1. 基本雷达图 2. 多组数据的雷达图 3 交互式雷达地图 4 动态雷达图 0 雷达图概述 雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也被称为蜘蛛图&#xff08;Spider Chart&#xff09;或星型图&#xff0c;是一种用于可视化多维数据的图表类型。雷达图通常由…

目标文件格式

目标文件里有什么 目标文件格式 目标文件就是源代码编译后但未进行链接的中间文件&#xff08;linux下的.o&#xff09;。 ELF文件&#xff1a;从广义上看&#xff0c;目标文件与可执行文件的格式其实几乎是一样的&#xff0c;可以将目标文件与可执行文件看成是一种类型的文…

【Vue面试题二十】、你有写过自定义指令吗?自定义指令的应用场景有哪些?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;你有写过自定义指令吗&a…

相似性搜索:第 1 部分- kNN 和倒置文件索引

图片来源&#xff1a;维亚切斯拉夫叶菲莫夫 一、说明 SImilarity 搜索是一个问题&#xff0c;给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 在数据科学中&#xff0c;相似性搜索经常出现在NLP领域&#xff0c;搜索引擎或推荐系统中&#xff0c;其中需要检索最…

课题学习(七)----粘滑运动的动态算法

一、 粘滑运动的动态算法 在实际钻井过程中&#xff0c;钻柱会出现扭振和粘滑现象&#xff08;粘滑运动–B站视频连接&#xff09;&#xff0c;但并不总是呈现均匀旋转。如下图所示&#xff0c;提取一段地下数据时&#xff0c;转盘转速保持在100 r/min&#xff0c;钻头转速在0-…

Namomo Summer Camp 23 Day 1

Namomo Summer Camp 23 Day 1 - Virtual Judge B - Brexiting and Brentering AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; string s; void solve() {cin>>s;int x-1;for(int is.size()-1;i>0;i--){if(s[i…

YOLOv5训练自己的数据集(超详细)

YOLOv5训练自己的数据集整个过程主要包括&#xff1a;环境安装----制作数据集----模型训练----模型测试----模型推理 一、准备深度学习环境 本人的笔记本电脑系统是&#xff1a;Windows10 首先进入YOLOv5开源网址 &#xff0c;手动下载zip或是git clone 远程仓库&#xff0c;本…