最简单易懂的闭包

闭包 最详细的闭包解释 自己的私藏 简单易懂 为了分吧自己的收藏拿出来了!来自印象笔记的资料本!全程干货!前端面试最全的闭包分类!看一下 终身受益!还有其他资源!没用砍我! 立即下载
一、作用域
     js特有的作用域,内部函数可以访问外部函数的参数和变量,这个很美妙哦!
     但是有时我们需要验证一个变量或属性的类型时,他就会自动向上查找直到原型,如果有则返回,如果没有则返回undefined。typedef、for in循环都会出现该问题;hasOwnPrototype就可以很好的避免这个问题,如果对象独有这个属性,则返回true否则false。
     但是外部的函数是不能访问到内部函数里面的参数和变量的。有时候我们需要内部变量,因此此处可以借助闭包。
二、闭包
     其实每一个函数都是一个闭包,都可以访问到函数外部的局部变量。函数里面嵌套函数只不过是更高级的闭包,有权访问另一个函数作用域中的变量。
     作用:1)可以帮助我们访问到内部的变量;2)让有些变量始终保存在内存中。
     例子详解:
     1.function create(){
var result = new Array();
for(var i = 0; i < 10; i++){
     result[i] = function(){
     return i;
          };
     }
     return result;
}
alert(create());
这个例子误以为是返回0到9,其实都是10。为什么呢?首先闭包只能取得函数中任何变量的最后一个值,还有我觉得最好理解的就是,var result[i]=function(){...};是一个函数表达式,函数()才能执行。因此i自增,每次返回都是function(){return i;}。解决办法如下:
function create(){
var result = new Array();
for(var i = 0; i < 10; i++){
result[i] = (function(num){
     return num;
})(i);
}
return result;
}
alert(create());
就相当于每次进行函数调用,自动传参。
      2.var name = "$$$";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
     return this.name;
};
}
};
console.log(object.getNameFunc()());//"$$$"
这种模式调用函数会自动将this绑定到全局对象,这是js语言设计错误。解决办法:给该方法定义一个变量(一般规范命名为that),并给其复制为this,内部函数通过变量访问到this,就可以绑定到对象上。
var name = "T$$$";
var object = {
name : "My Object",
 getNameFunc : function(){
var alin = this;
return function(){
     return alin.name;
};
}
};
console.log(object.getNameFunc()());//My Object
      3function cnt(){
     var i = 0;
     function inner(){
console.log(i);
i++;
     }
     return inner;
}
var result = cnt();
result();//0  result();//1result();//2
该例子和第一个例子很像,但是这个更加清晰的解释了函数里面嵌套函数,即为闭包。return就相当于链接内部函数与外部函数的桥梁。cnt()依赖于inner(),inner()又依赖于cnt(),所以i始终存在于内存中。
3.js内存机制
     js闭包代码不出错是不会有内存泄露的,这种情况值存在于IE6/7里,是浏览器的问题而不是代码本身的问题,因为他们用的引用计数机制。
     所有语言内存生命周期都是相似的:1)当需要时候分配内存;2)对内存进行读写操作;3)当不在需要时释放内存。
     标记清除法:“可回收”即“对象不可达”,即访问不到。这种算法,会定义一个“根”,定期从“根”出发,找出“根”下的所有对象,看是否能找到一条路径找到该对象。从不同的“根”出发,若对象不可达,则被回收。
     例如在循环中,没循环一次计数机制便加一,当循环结束,计数并不能为0,但不再引用,就回收不了。如果标记清楚发,顺着根找,函数调用完后就没有任何,循环中的对象不再被任何人引用,所以回收。




后续:(知识都是相通的,这些可以更好的理解闭包)
1.函数声明和函数表达式的不同点:
1>函数声明会提升当前执行环境(作用域)上的函数声明,而函数表达式必须等到js执行到它所在行时,才会由上往下解析函数表达式;
2>函数表达式后面可以加括号调用该函数,函数声明不行。如下例子:
fnName();
function fnName(){
...
}
//正常,提升了函数声明,调用可在声明之前
faName();
var fnName = function(){
...
}
//报错,变量还未保存对函数的引用,调用必须在表达式之后
var fnName = function(){
...
}();
//函数表达式后面加括号,js引擎解析到此就可以立即调用函数
function fnName(){
...
}();
//不会报错,js解析会自动忽略后面的括号,函数声明但不会被调用
function(){
...
}();
//语法错误,虽然匿名函数属于函数表达式,但没有进行赋值操作
3>(function(){...})();
     (function(){...}());
     要在函数后面加括号立即被调用。这个函数必须是函数表达式,不是函数声明。如下例子:
(function(a){
     console.log(a);
})(123); //123,使用()运算符

(function(a){
     console.log(a); //firebug输出1234,使用()运算符
}(1234));

!function(a){
        console.log(a); //firebug输出12345,使用!运算符
}(12345);

+function(a){
        console.log(a); //firebug输出123456,使用+运算符
}(123456);

-function(a){
        console.log(a); //firebug输出1234567,使用-运算符
}(1234567);

var fn=function(a){
        console.log(a); //firebug输出12345678,使用=运算符
}(12345678);
     所加符号都是将函数声明变为函数表达式。
     !、+、-、=、()会和函数的返回值进行运算,造成不必要的麻烦。
     这样写的用处:js没有私有作用域,很多人开发难免造成变量冲突。根据js作用域链的特征,可模仿私有作用域,匿名函数当做一个容器,容器内可以访问外部变量,而外部环境不能访问容器内的变量。可把这个容器当做一个命名空间,外部的不能访问里面的,不会发生命名冲突。
     function a(){
var i = 0;
function b(){
alert(++i);
}
return b;
     }
     var c = a();
     alert(c());
  1. 当定义函数a的时候,js解释器会将函数a的作用域链(scope chain)设置为定义a时a所在的“环境”,如果a是一个全局函数,则scope chain中只有window对象。
  2. 当执行函数a的时候,a会进入相应的执行环境(excution context)。
  3. 在创建执行环境的过程中,首先会为a添加一个scope属性,即a的作用域,其值就为第1步中的scope chain。即a.scope=a的作用域链。
  4. 然后执行环境会创建一个活动对象(call object)。活动对象也是一个拥有属性的对象,但它不具有原型而且不能通过JavaScript代码直接访问。创建完活动对象后,把活动对象添加到a的作用域链的最顶端。此时a的作用域链包含了两个对象:a的活动对象和window对象。
  5. 下一步是在活动对象上添加一个arguments属性,它保存着调用函数a时所传递的参数。
  6. 最后把所有函数a的形参和内部的函数b的引用也添加到a的活动对象上。在这一步中,完成了函数b的的定义,因此如同第3步,函数b的作用域链被设置为b所被定义的环境,即a的作用域。
springcloud教程 -- 1.快速搭建入门级demo,看这一篇就够了 废话不多讲,跟紧我,开启你的SpringCloud初体验 首先回顾微服务的基本组成: [图片 here] 生产者:提供服务 消费者:消费服务 服务注册/发现中心:服务注册,发现,监控 所以,首先明白springcloud微服务的架构基础:生产者(client),消费者(client),服务注册/发现中心(server) 阅读详情

相关推荐

(25.08)Ubuntu20.04+ROS1复现FAST-LIO2

请确保在。

m0_69023437的博客 3994

手把手教你学会闭包

前言 MDN对闭包的解释是这样的:一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。MDN文档 解释有点抽象,不好理解,现在我们用代码的形式来解释下。 一. 闭包概念解析 闭包让你可以在一个内层函数中访问到其外层函数的作用域 (1) 父对象的所有变量,对子对

m0_45093055的博客 2616

禾赛PandarXT-16/阿努比LpmsIG1运行lio-sam

课题是多传感器融合,将GNSS/INS/LIDAR做融合定位导航,故考虑使用lio-sam开源算法,在此记录一下我在适配传感器数据时遇到的一些问题;

qq_44705939的博客 2963

最简单易懂闭包讲解

简介 闭包在web前端开发中特别重要,好多前端开发者工作了几年都不知道闭包原理。现在我就讲一下【闭包】希望各位开发者都能够理解其原理。网上的教程也很多,希望这篇您真的能够学会使用。 概念 Closures (闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相应的函数来指代这些作用域。(可以访问独立数据的函数) 变量作用域 变量声明,无论发生在何处,都在执行任...

weixin_34148508的博客 233

Pcileech(DMA)开源项目简述

希望大DMA家能正确认识FPGA,正确使用DMA技术,对于市场上各类伪装成花里胡哨设备的FPGA板卡它的本质是不会变的,不要上当受骗。

2301_79773847的博客 5965

【faers数据库-R语言】

摘要:本文详细介绍了FAERS数据库不良反应信号挖掘的完整流程,包括数据解压导入(R代码示例)、数据结构理解、数据清洗(缺失值处理、标准化、合并和编码映射)、信号挖掘准备(药物-反应组合表创建)以及信号强度指标计算(PRR和ROR)。重点阐述了数据清洗的关键步骤,如缺失值处理(colSums(is.na()))、数据标准化(toupper()、as.Date())和表合并(merge()),并提供了完整的R语言实现代码。最后强调结果需结合临床知识解读,建议使用data.table等高效工具处理大数据。整个流

weixin_46587777的博客 1503

闭包的介绍、构成条件、作用

闭包的介绍、构成条件、作用

IT之一小佬的博客 1178

网红商品数据抓取:基于Python的高效爬虫实战

本篇博客介绍了从爬取到存储、分析和可视化网红商品数据的完整流程。通过Python的强大生态,我们能够轻松完成复杂的数据抓取任务。在实际应用中,还可以将此爬虫与机器学习模型结合,进一步挖掘数据价值。

2201_76125261的博客 1476

什么是闭包为什么它在JavaScript中很有用

闭包的基本概念闭包的作用代码示例示例一:简单的闭包示例示例二:使用闭包模拟私有变量示例三:闭包与事件监听器示例四:闭包与立即执行函数表达式(IIFE)示例五:使用闭包进行记忆化实际工作中的技巧。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1427

GPS天线结构、原理、测试

【有源陶瓷天线构成】GPS天线是由接收天线和前置放大器两个部件组成。GPS接收天线的作用,是将卫星来的无线电信号的电磁波能量变换成接收机电子器件可摄取应用的电流。绝大部分内置GPS天线为右旋极化陶瓷介质,其组成部分为:陶瓷天线、低噪音信号模块、线缆、[接头](h

数字世界 万物互联 2万+

基于C#开发ABB机器人上位机系统:从操作控制到数据交互的全方位实现

ABB工业机器人是世界领先的自动化设备之一,广泛应用于焊接、装配、搬运、喷涂、包装等多个行业。机器人控制器:用于控制机器人运动、路径规划、状态监控等。上位机系统:提供人机交互界面,允许操作员与机器人进行交互,实现实时控制、参数调整和数据分析。上位机系统通过与机器人控制器通信,采集机器人状态数据,发送控制指令,实现远程监控和控制操作。通过高效的操作界面和数据交互,可以大大提高机器人的工作效率和系统的可维护性。基于C#开发ABB机器人上位机系统,能够实现高效的机器人控制与实时数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1180

什么是闭包,如何利用闭包解决问题?

闭包是指一个函数和其相关的引用环境组合而成的实体。在JavaScript中,闭包是指一个函数可以访问其外部作用域的变量,即使在外部函数已经返回的情况下。

祈澈菇凉 2129

基于coze studio开源框架二次定制开发教程

CozeStudio是一站式AIAgent开发工具,支持大模型接入、智能体编排、工作流开发等功能。采用Golang+React技术栈,基于微服务架构设计。项目包含后端API、领域逻辑、前端应用等模块,支持自定义任务流节点开发。开发流程涵盖前后端节点定义、实现逻辑编写等步骤,提供完整的开发规范和参考文档。相比商业版,开源版本在功能上有所精简,但仍保留核心开发能力。

coding change your life 791

通俗易懂的js闭包

1、闭包是什么鬼? 当内部函数被保存到了外部时,将会生成闭包。闭包会导致原有的作用域链不释放,造成内存泄露。 如果i不知道作用域链是什么鬼,那么请看前两篇。 function outer(){ function inner(){ } return inner; } var demo = outer(); demo...

Zystem 3310

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最简单的例子让你轻松理解JavaScript闭包

最简单的例子让你轻松理解闭包 在理解闭包之前,为了让大家更好的理解闭包,我举一个形象的例子。在JS里有着作用域的概念,那么作用域是什么呢?有什么用呢?下面这个例子能形象的体现 比如每一座城市,城市里乡镇啊有公园,超市等,这些建筑设施就构建了这一个城市(环境),那么这些环境构成的依据是什么呢?是有人依赖它,用它。当这个城市的的人迁出这个城市,那么这个城市没有人再依赖他,那么它的存在就没有意义了, ...

weixin_45717379的博客 2871

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

(包懂)JS通俗易懂的理解闭包

本文章举了3个生动形象的故事来比喻闭包,即使你是JS新手,你也可以弄清楚闭包!

feeeee889的博客 162

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

通俗易懂的闭包

不知道为什么,看到闭包这两个字感觉贼亲切,哈哈哈。 闭包 闭包的概念(简单粗暴形象点): 函数中内嵌另一个函数,或者是一个函数中有另一个对象,里面的函数或者是对象都可以使用外面函数中定义的变量或者是数据,此时就形成了闭包。 (什么还是不懂?感慨自己智商感人,索性再写的大白话点,让自己对闭包有个好点的认识。函数A中,有一个函数B,函数B中可以访问函数A中定义的变量或者数据,此时就形成了闭包...

weixin_43895989的博客 527

js闭包简单易懂版

js闭包简单易懂版一、变量的作用域二、如何从外部读取局部变量三、闭包的概念四、闭包的用途五、使用闭包的注意点六、思考题 一、变量的作用域 变量作用域分为两种:全局变量和局部变量 JS中函数内部可以直接读取全局变量 var n = 99; function F1 (){ console.log('n') } F1() // 99 在函数外部自然无法读取函数内的局部变量 function f1(){ var n = 99 a = 88 // 注意:函数内部声明变量的时候,一定要使用var等声明,否则实际

qq_45384585的博客 442

Python教程第9章 | 通俗易懂学闭包

本文通过一个需求探讨闭包的基本概念与用法,帮助快速理解闭包。

仲君Johnny的博客 1121

通俗易懂的JavaScript闭包原理

通俗易懂的JavaScript闭包原理

申小兮和林小兮的博客宝 1257

闭包(含实例代码,通俗易懂)

闭包实现累加: var count = 0 var fn1 = function () { return function (){ count++ console.log(count) } } var fn2 = fn1() fn2() fn2() fn2() fn2() 闭包实现函数只有一次有效调用: var fn1 = functi...

Delicia_Lani的博客 3523

JavaScript 通俗易懂的闭包

ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(完成工作的方法,是爱惜每一分钟。——达尔文) ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ 大名鼎鼎的闭包!这一题终于来了,面试必问。 请用自己的话简述 什么是「闭包」。 「闭包」的作用是什么。 首先来简述什么是闭包 假设上面三行代码在一个立即执行函数中(为简明起见,我就不写立即执行函数了,影响读者理解)。 评论里没看完就说我写得有问题的,请看清楚哦: 上面三行代码在一个立即执行函数中。 三行代码中,有一个局部变量 local,有一个函数 foo,

Nodejs 288

C#闭包最通俗易懂的解释

闭包本质是一个对象(编译后) 。闭包是指捕获(引用)了作用域外的函数的局部变量的函数。由于外部函数的局部变量被捕获,即使外层函数执行已终止,内部定义的函数也可以访问外部函数的局部变量,所以局部变量的生命周期得到了延长。

qq_38846826的博客 1937

通俗易懂地总结JavaScript 闭包

闭包demo 我们先看一个闭包的简单demo,对于我们来说,看代码比自然语言更能理解一个事物的本质。其实,闭包无处不在,比如:jQuery、zepto的核心代码都包含在一个大的闭包中,所以下面我先写一个最简单最原始的闭包,以便让你在大脑里产生闭包的画面: function A(){ function B(){ console.log('Hello world!'); ...

rotation博客 338

用最简单的语言解释Python的闭包是什么?

Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西。 闭包的概念 我们尝试从概念上去理解一下闭包。 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。—— 维基百科...

python学习者的博客 988

我对闭包的理解,非常浅显易懂

前言 这篇文章有些东西都是我自己的猜测,百度也百度不到,也可能是我不太会百度…希望有懂的人能反驳一下。 但是我觉得这篇文章用来学习闭包还是挺不错的,至少很浅显易懂。 总结 闭包是编程语言的特性(编程语言中函数的特性),有些编程语言是支持闭包的,比如js的函数就是闭包的,有些语言不是闭包的,额我也不知道有哪些… 函数执行时,函数体内访问的变量是从函数声明位置往外寻找的,就是闭包;相反,函数执行时,函数体内访问的变量是从函数调用位置往外寻找的,就是不闭包 闭包和不闭包对编程语言的影响主要在于: 要不要把函数的

ef_ef的博客 351
上一篇: 前端常用网站整合
下一篇: css绘图
Alin_leeon
博客等级 码龄11年 8粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值