JS 闭包

线性分类器(Linear Classifier) 线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两 阅读详情

前置知识:
1.JavaScript有两种作用域:全局作用域和函数作用域。函数内部可以直接读取全局变量,函数外部不能访问内部变量
2.函数执行完毕后,局部活动对象会被销毁
3.内存中仅保存全局作用域(全局执行环节的变量对象)

需求:
如果出于种种原因,需要得到函数内的局部变量。正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。

function f1() {
  var n = 999;
  function f2() {
  console.log(n); // 999
  }
}

上面代码中,函数f2就在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是JavaScript语言特有的”链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

function f1() {
  var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); // 999

上面代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。


定义:闭包是有权访问另一个函数作用域中的变量的函数。
创建闭包常见方式:在一个函数内部创建并返回另一个函数。
闭包产生的时机:外部函数执行,内部函数声明的时候。


闭包就是函数f2,即能够读取其他函数内部变量的函数。由于在JavaScript语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如f2记住了它诞生的环境f1,所以从f2可以得到f1的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的最大用处有两个**,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。**

function fn(m) {
var max = 1
  return function () {
	  if(max < m){
		  return m++;
	  }
  };
}

var inc = fn(5);

inc() // 5
inc() // 6
inc() // 7

上面代码中,m是函数fn的内部变量。通过闭包,m的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包inc使得函数fn的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。

为什么会这样呢?原因就在于inc始终在内存中,而inc的存在依赖于fn,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收。

高程中是这样解释的:调用fn(),产生fn()执行上下文环境,压栈,并设置为活动状态。,fn()调用完成。按理说应该销毁掉fn()的执行上下文环境,但是这里不能这么做。注意,重点来了:因为执行fn()时,返回的是一个函数。函数的特别之处在于可以创建一个独立的作用域。而正巧合的是,返回的这个函数体中,还有一个自由变量max要引用fn作用域下的fn()上下文环境中的max。因此,这个max不能被销毁,销毁了之后bar函数中的max就找不到值了。
因此,这里的fn()上下文环境不能被销毁,还依然存在与执行上下文栈中。


常见误区
1.必须是return function
1-1.对象属性应用

const obj = {};
function outFun (){
    var a = 0;
    obj.newFun = function innerFun(b){
        a+=b;
        return a;
    }
}
outFun();
var res1 = obj.newFun(1);
console.log(res1);   //1
var res2 = obj.newFun(2);
console.log(res2);   //3

1-2全局变量引用

let newFun;
function outFun (){
    var a = 0;
    newFun = function innerFun(b){
        a+=b;
        return a;
    }
}
outFun();
var res1 = newFun(1);
console.log(res1);   //1
var res2 = newFun(2);
console.log(res2);   //3

1-3全局数组引用

let arr = [];
function outFun (){
    var a = 0;
    function innerFun(b){
        a+=b;
        return a;
    }
    arr.push(innerFun);
}
outFun();
var res1 = arr[0](1);
console.log(res1);   //1
var res2 = arr[0](2);
console.log(res2);   //3

总结:
文章的输出节奏也是根据红宝书的目录来的,不知道大家第一次看到函数这块的感觉是什么样的,我是真的很头疼,加上网上的博客辅助理解,这才明白过来,写下来和大家共勉。自己慢慢也发现好记性不如烂笔头,一些东西记录下来对自己的理解帮助更大。

C++cgal库配置+VS2017 Cgal几何图形库在VS2017上的下载、安装与配置。想要一口气下载完所有安装配件的,可以去文章末尾的链接。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。 阅读详情

相关推荐

AI工作流革命:从n8n到Sora2,揭秘自动化视频创作的底层逻辑

本文深入探讨了AI工作流在自动化视频创作中的应用,重点介绍了n8n、Coze和Sora2的组合如何实现从链接输入到视频输出的全流程自动化。通过三层架构解析、关键技术模块优化及成本控制策略,这套方案显著提升了视频生产效率,适用于电商、热点追踪等多种场景。

gg901的博客 1086

js中闭包的简单介绍

在js中,函数内部可以直接读取全局变量。在函数外部无法读取函数内部的局部变量。通过闭包,可以在函数外面访问到内部变量的函数。 一、了解闭包 ① 闭包定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。 ② 表现形式:函数外部能够调用函数内部定义的变量 ③ 变量的作用域: 全局变量和局部变量。 函数内部申明变量...

qq_40072782的博客 285

ubuntu20.04升级OpenSSH

业务需求,需要将服务器的OpenSSH版本从8.2升级到最新版本(9.9),由于apt能提供的最新版本就是8.2,所以需要采用源码安装的方式。

xiamu66的博客 1525

【JavaScript】一文了解JS的闭包

详解JavaScript的闭包使用及其日常开发遇到的常见问题

ztK63LrD的博客 4054

京瓷扫描驱动安装_京瓷喷头拆解和供墨原理剖析

在工业喷头打印领域,京瓷喷头作为主流喷头广泛应用于喷墨行业,目前京瓷喷头市面上销售主要有两个系列:KJ4A和KJ4B。其中KJ4A系列设计是用于油性墨水,例如UV墨水,主要用在广告领域;而KJ4B设计用于水性墨水,例如活性、分散墨水等,主要用在数码印花领域。最近我们团队对京瓷喷头进行了拆解分析,本期和大家分享一下我们对京瓷喷头拆解和喷头供墨原理的研究。京瓷喷头介绍1. KJ4A系列(油性)如下图所...

weixin_39883906的博客 1673

机械臂速成小指南(七):从旋转矩阵到齐次变换——机械臂位姿的数学表达

本文详细介绍了机械臂位姿描述的数学基础,包括旋转矩阵、欧拉角和齐次变换等核心概念。通过解析旋转矩阵的几何意义和合成方法,以及欧拉角的直观描述,帮助读者理解机械臂位姿的数学表达。文章还探讨了齐次变换在工程实践中的应用,并提供了数值稳定性、坐标系约定和计算效率等实用建议。

cuda7parallel的博客 835

JavaScript — 闭包、闭包的作用、生命周期、自定义JS模块

目录 一、理解闭包 1.如何产生闭包? 2.闭包到底是什么? 3.产生闭包的条件? 4.常见的闭包 二、闭包的作用 三、闭包的生命周期 四、闭包的应用——自定义JS模块 五、闭包的缺点及解决 1.缺点 2.解决 一、理解闭包 1.如何产生闭包? 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包 2.闭包到底是什么? *使用chrome调试查看 *理解一:闭包是嵌套的内部函数(绝大部分人) *理解二:包含被引用变量(函数)的..

m0_59897687的博客 1130

使用Java实现CRC16 MODBUS 格式校验

CRC16校验,测试如下 String str = "a5 98 03 00 00 5f c6 0f 7c 40 78 06 09 46 dc 6e db 00 16 3e 12 5c 98 00 19 98 0e 10 03 06 09 46 dc 6e db 03 0b bf 5f c6 0f 7c 43 bd b9 61 ee 96 76 99"; 校验规则: /** * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结

weixin_45063710的博客 1315

js javascript 前端 闭包

文章目录一、前言二、案例1. 函数闭包2. 对象闭包3. 缓存案例4. 沙箱5. 经典案例 参考资料: 菜鸟教程 博客1 一、前言 闭包指能够读取其他函数内部变量的函数。 二、案例 1. 函数闭包 function a(){ var num=1; function b(){ num++; cosole.info(num); } } 2. 对象闭包 function e(){ va...

helloWorldAndYou的博客 250

TYPE-C PD协议实战:如何用LDR6028芯片实现边充电边OTG(附完整电路设计)

本文详细解析了如何利用LDR6028芯片实现TYPE-C接口在PD协议下的边充电边OTG功能。通过剖析PD协议双角色协商的核心挑战,提供了完整的硬件电路设计要点,包括Type-C接口配置、电源路径管理及系统框架,并附有调试实战指南,助力开发者构建稳定可靠的一线多用解决方案。

c6d7e8f9g的博客 1128

Android一个APP里面最少有几个线程

Android应用启动时,默认会创建一个进程,该进程中最少包含负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应用无响应)。当对象重写了finalize()方法时,该线程负责将这些对象放入队列并调用其finalize()方法,完成资源释放后再由GC回收。监控的执行效率。如果finalize()方法执行超时(默认10秒),此线程会触发虚拟机退出以防止应用长时间阻塞。

编程进化论 613

【JavaScript基础】深入了解JS的闭包

闭包是JS中一个重要的概念,也是面试中的重点,相信大家在面试中都会碰到这样的几个问题: 1. 请你说说什么是闭包? 2. 请你说说闭包有哪些应用? 3. 请你说说闭包有哪些优缺点? 大家都是怎么回答这几个问题的呢?在网上的文章中对闭包的概念都有不同的说法,导致很多人对闭包没有一个清晰的概念,接下来就和我一起探究什么是闭包。 首先...

weixin_41531446的博客 350

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2042

javascript深入理解js闭包

javascript深入理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

记事本 3746

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

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

js闭包作用问题解决应用,javascript中闭包的定义

当 JavaScript 引擎在 Foo 作用域中没有找到 a 时,它会首先从 Foo 作用域的父作用域,也就是 Bar 作用域中寻找 a,它确实找到了 a。这里需要注意的是,increase1和increase2是通过不同的函数调用createCounter创建的,它们不共享内存,它们的i是独立的,不同的。If Scope 声明了自己的计数,所以我们在这个作用域中使用的计数就是当前作用域的计数。

2301_79533350的博客 731

计算机控制技术及应用

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

闭包js闭包javaScript闭包es5闭包

es5作用域:全局作用域 + 函数级别作用域 闭包:一个函数内部的函数叫做闭包。相当于函数内部与外界连接的桥梁。 闭包解决的问题:a 帮助函数外部读取函数级别作用域中的变量 而存在。b 变量的值始终保存在内存中。 不能滥用闭包:闭包会使函数中的变量始终保存在内存中,内存消耗大,滥用闭包会对网页性能有影响。 2.7 闭包–解决循环变量问题 2.8 闭包中的this 闭包中的this默认情况下指向window.........

angrynouse的博客 270

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Javascript】Js闭包

同时f2是f1的局部方法,f2在内存中导致f1也始终在内存中。因为f2同样在f1方法内部,所以f1的内部所有变量对f2都是可见的,这时只要把f2作为返回值,我们就可以在f1外部读取到f1的局部变量。注意:f1中局部变量对f2是可见的,但是f2中局部变量对f1则是不可见的。官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

小罗的博客 644

js 点击闭包_JavaScript 闭包的应用

前言面试问题:说一下对变量提升的理解说明this的几种不同的使用场景创建10个<a>标签,点击的时候弹出来对应的序号如何理解作用域实际开发中闭包的应用涉及到的知识点:执行上下文this作用域作用域链闭包执行上下文执行上下文主要有两种情况:全局代码: 一段<script>标签里,有一个全局的执行上下文。所做的事情是:变量定义、函数声明函数代码:每个函数里有一个上下文。所做的事...

weixin_28709649的博客 136

js 点击闭包_JavaScript闭包应用介绍

来源 |https://www.zoo.team/article/vue3-jsx本文介绍一下js中的一个重要概念——闭包。其实即便是最初级的前端开发人员,应该都已经接触过它。一、闭包的概念和特性首先看个闭包的例子:function makeFab () { let last = 1, current = 1 return function inner() { [curren...

weixin_39656686的博客 116

js 闭包传参_JavaScript 闭包图文解析

什么是闭包?我们来看看 MDN上的解释:Aclosureis the combination of a function bundled together (enclosed) with references to its surrounding state (thelexical environment). In other words, a closure gives you acce...

weixin_29508487的博客 203

js 闭包传参_javascript深入理解js闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。var n=999;function f1(){alert(n);}f1(); // 999另一方面...

weixin_26849971的博客 701

java script 闭包_JavaScript之闭包

第一部分:基本概念我们知道根据作用域链的规则,一个函数是不能访问到在与他同一个作用域内的函数内的内部变量的,如下所示:function foo() {var a = 5;console.log(a);}foo();function bar() {var b = a + 5;console.log(b);}bar();在执行到第二个函数时,由于找不到a,所以会报错: a is not defined...

weixin_39944638的博客 163

js闭包循环原因_javascript与闭包

定义闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。作用一、 存储变量闭包可以保存外部函数的变量,内部函数保留了对外部函数的活动变量的引用,所以变量不会被释放。可以用在把一些不经常变动计算起来又比较复杂的值保存起来,节省每次的访问时间。示例:f...

weixin_39804329的博客 246

【JS】JavaScript之闭包的详细解释

前言 闭包在js中应用非常广泛,也是极为重要的知识点。刚开始了解闭包时也是云里雾里,花了好长时间才搞明白。下面来详细叙说一下闭包的知识。 一、准备知识 要理解好闭包的概念,我们首先得清楚下面的三个知识点: 作用域(全局变量和局部变量) 链式作用域结构 js垃圾回收机制 1、作用域 变量作用域分为全局变量和局部变量 先看下面一段js代码 var name = '小明' funct...

qq_40060547的博客 320

【JS】JavaScript中的闭包

在JavaScript中,闭包指的是有权访问另一个函数作用域中的变量的函数;创建闭包最常见的方式就是在一个函数内创建另一个函数。如下例子: function A(propertyName){ return function(object1, object2){ var v1 = object1[propertyName]; va...

aodongni1633的博客 183

js中的闭包到底是什么啊,javascript中闭包的定义

当然,在不使用我们定义的函数的情况下编写程序是可能的——虽然很困难,但也是可能的。“自然”的选择是将这段代码放在一起,形成一个可复用的集合,而这个可复用的集合就是我们所说的函数。在这个简化的示例中,我们创建了一个函数,该函数接收您要显示的标题并返回另一个满足 RenderItem 作为道具接收的函数定义的函数。但是,当您创建解决方案时,了解它们的存在以及它们的实际工作方式会开启新的可能性。这个想法是将您的模块“包装”在一个立即执行的函数中。这是函数创建函数或对象的时候,例如,允许您创建用户对象的函数。

wenangou6 627
上一篇: JS 继承
下一篇: js this
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值