最简单易懂的闭包

闭包 最详细的闭包解释 自己的私藏 简单易懂 为了分吧自己的收藏拿出来了!来自印象笔记的资料本!全程干货!前端面试最全的闭包分类!看一下 终身受益!还有其他资源!没用砍我! 立即下载
一、作用域
     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的作用域。
新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败? 本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。 阅读详情

相关推荐

波分复用技术原理

波分复用原理 把不同波长的光信号复用到同一根光纤中进行传送,这种方式我们把它叫做波分复用( Wavelength Division Multiplexing ) 一根光纤被划分为多个波道,多个波长以一定的间隔隔开,在光纤中独立传输。 波分复用应用演示 如果将WDM系统看作交通系统,光纤可以看作是多个车道的公用道路。 各种类型的业务就像货物一样,被打包装载到车辆中。 车辆按照分配的车道行驶至目的地,完成货物的运输。 想要提高波分复用系统的传输容量,就要增加波道数量或是提升单波传...

m0_63251770的博客 9997

手把手教你学会闭包

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

m0_45093055的博客 2616

别再只盯着时序了!聊聊SDC里那些容易被忽略的‘配角’命令:工作条件、线载模型与面积约束

本文深入探讨了SDC(设计约束)中常被忽视的关键命令,包括set_operating_conditions、set_wire_load_model和set_max_area。这些‘配角’命令在芯片设计中扮演着至关重要的角色,影响时序收敛、功耗和面积优化。文章通过实际案例和最佳实践,揭示了如何正确配置工作条件、选择线载模型以及动态调整面积约束,以提升设计质量和效率。

weixin_26875109的博客 208

最简单易懂闭包讲解

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

weixin_34148508的博客 233

STM32控制气泵和电磁阀实现

2、mos管的选型:mos管选择主要注意两个参数即可,一是导通的电流,二是耐压值,并且常用NMOS管,根据要求,气泵和电磁阀供电电压为12V,所以选择的mos管耐压值要大于12V,这里选用耐压值为30V的MOS管,并且导通电流为5.8A,如下图。1、气泵和电磁阀的开和关均为开关量,实现控制方法有多种,比如继电器,但是继电器动作有噪声且体积较大,更好的方法为使用mos管。使用STM32控制气泵和电磁阀的开和关,气泵和电磁阀的供电电压为12V。最终实现单片机控制气泵和电磁阀的开和关。

jacklood的博客 1万+

无人机基本组成部件

无人机基本组成部件

qq_37410522的博客 1万+

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

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

IT之一小佬的博客 1178

Hive SQL零基础到精通:100道练习题+答案,SQL能力快速提升

我将以我15年架构与开发的经验,带领大家从零基础到精通,通过精心设计的100道练习题及其详解,系统地、深度地掌握Hive SQL的核心精髓。它可以将结构化的数据文件映射为一张数据库表,并提供了一套类SQL的查询语言——HiveQL(简称HQL),允许熟悉SQL的用户直接查询存储在HDFS上的海量数据。它将Job描绘为DAG(有向无环图),允许更灵活的任务编排,避免不必要的中间落盘,可以复用容器,从而大幅降低延迟。希望你以此文为起点,在广阔的大数据世界里继续遨游,成为一名真正的数据高手!

架构师的AI之路,分享AI应用开发架构的学习与实践。 798

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

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

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

Apollo和autoware规划算法代码ros移植-路径规划可跑工程分享

Apollo6.0规划核心代码移植到Ros工程,可编译移植分享

weixin_39735688的博客 8509

【深度学习新浪潮】OpenClaw技术架构详解:从核心组件到生产级优化

OpenClaw 以三层解耦架构 + 四大核心模块为基础,实现了本地优先、易部署、易扩展、易优化的 AI 智能体平台。开发者可通过极简部署快速落地,再通过量化、缓存、并发、分布式等手段持续优化性能,适合从个人助理到企业级自动化的全场景应用。

专注:太空算力、AI infra、异构调度、大模型成本工程 2921

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

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

祈澈菇凉 2129

【WRF模拟】保存wrf输出文件到指定目录+仅输出指定空间域/变量文件

修改wrf命令以更改指定输出文件目录等

WW、forever的博客 544

通俗易懂的js闭包

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

Zystem 3310

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

weixin_45717379的博客 2871

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

feeeee889的博客 162

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

通俗易懂的闭包

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

余额充值