千家信息网

怎么理解javascript闭包

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本篇内容介绍了"怎么理解javascript闭包"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一梯
千家信息网最后更新 2025年01月18日怎么理解javascript闭包

本篇内容介绍了"怎么理解javascript闭包"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

第一梯队理解

我个人认为闭包之所以难以理解很重要的一点在于,很多概念我们在理解的过程中都会在潜意识里和这个概念本身的名词强度关联在一起在揣摩这个概念的意思,如果自己的理解和这个名词本身的字面意思看上去不那么相关的话,就会在内心产生巨大的怀疑感,不敢相信自己的理解是否正确,哪怕是正确的。所以在立即一个概念本身的含义过程中需要一个步骤就是将自己对概念的理解和名词本身找到某种莫名的连接方法就好理解了。

而闭包这个名词换做谁听上去都不知道是在说什么,这本身就给理解这个概念造成了很大的困惑,因为一个通俗易懂的代名词就可以很好地解释一个概念的50%了。比如变量就是变化的字面量,条件语句,分支语句大家一听就很好理解其概念是什么。所以首先大家需要在概念上给闭包建立一个初级的感性认识。一下这句话是我见到的简单易懂的一种解释。

functions that return functions

意思是:闭包就是一个函数,只不过这个函数是另一个函数的返回值。

没错,最表面上看似乎就是这样的。比如写一个闭包:

function fn1() {       var temp = 10;       return function() {           console.log(++temp);       }  }  fn1()();

上面的例子里return出来的那个function就是一个非常简单的闭包,表面上看和上面的定义语句差不多就是一个从函数里返回的函数。

***梯队的理解到这接差不多了,虽然不正确,虽然很粗糙,但对形成一个感性认识应该是够了,总结一个***梯队的认识,什么是闭包:

  • 一个函数

  • 被其他函数return出来的函数。

这个时候认识里面应该有这么一个概念,就是闭包和我们已经理解的一个概念应该差不多,那就是函数,没错刚开始就可以这么理解,闭包就是一个函数,是一个特殊的函数,就好像js中的方法也是函数一样。

第二梯队理解

有了***梯队的认识,我们慢慢修正大脑中对闭包的认识。有的人理解闭包就是一个嵌套在函数里的函数,内部函数可以访问外部函数的数据而已。这么理解是不对的。看下面这段代码:

function fn1() {   var temp = 10;   function fn2() {       console.log(++temp);   }   fn2() } fn1()

可是这时的fn1()无论执行多少次打印都是11,永远不会变,所以这还不是闭包,只有当你return出来一个内部function的时候才会形成一个闭包,闭包就是return出来的这个函数。这个内部函数可以close-over外部函数的变量直到内部的这个函数(闭包)结束掉。

这时我们再来看看***梯队中的代码

function fn1() {       var temp = 10;       return function() {           console.log(++temp);       }  }  vat func1 = fn1(); // func1就是一个闭包(就是fn1返回的函数)。  func1(); // 打印11  func1(); // 打印12

这个时候func1是全局变量,但是打印的时候却访问的是fn1的局部变量temp并且,当fn1()函数执行完之后,temp的变量并没有被垃圾回收到仍然存在于内存中,这就是闭包的特点。也就是刚刚我们说的内部函数close-over外部函数的变量。理解这句话就可以很好的与闭包这两个字关联起来理解闭包这个概念了。

总结第二梯队理解:

  1. 闭包是一个有特定功能的函数。他是一个可以读取其他函数内部变量的一个函数。

  2. 因为在javascript中如果你想读取一个函数内的变量(通常称为局部变量)只有函数的子函数可以访问。

  3. 那么将这两个概念交叉理解,就可以简单的理解闭包就是一个定义在函数内部的函数,且可以访问函数里的局部变量的那个函数。

  4. 在没有闭包,我们没法访问函数内部的局部变量,有了闭包之后,我们就可以访问函数内部的局部变量了,等同于闭包解决了一个问题,那就是在函数内部和函数外部之间建立了一座桥梁。

第三梯队理解

这个时候我们可以看看官方定义的闭包:闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以"记忆"它被创建时候的环境。

再看另一个定义:那么什么是闭包呢?这里有两个定义。在计算机科学中(而不是数学中),一个闭包是一个函数或者一个函数的引用,以及他们所引用的环境信息(就像是一个表,这个表存储了这个函数中引用的每一个没有在函数内声明的变量)。

这两个定义中都有一个概念,***个里"封闭的作用域",第二个里"所引用的环境信息"。这里我们都可以用上面的close-over外部函数的变量暂时理解。

也就是闭包总是要有两个部分的:

  1. 一部分是一个函数。

  2. 另一个部分是被这个函数"包住"的(有的理解为"带走"的,或者是close-over住的)一些环境信息(可以理解环境信息就是变量),但是却不在这个函数中声明的变量表(称之为free variables或者outer variables)。

还有一个不是那么呆的定义:闭包允许你封装一些行为(函数就是行为),像其他对象一样将它传来传去(函数是first-class function),但是不论怎样,它仍然保持着对原来最初上下文的访问能力(它还能访问到 outer variables)。

这个时候的理解就比较抽象了,因为又涉及到作用域的概念,又是一个封闭的作用域。其实上面括号中有一段话(就像是一个表,这个表存储了这个函数中引用的每一个没有在函数内声明的变量),这个表就是在定义这个闭包的"闭"的范围有哪些。

第四梯队理解

闭包通过访问外部变量,一个闭包可以维持(keep alive)这些变量。在内部函数和外部函数的例子中,外部函数可以创建局部变量,并且最终退出;但是,如果任何一个或多个内部函数在它退出后却没有退出,那么内部函数就维持了外部函数的局部数据。

"怎么理解javascript闭包"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

函数 闭包 变量 就是 概念 梯队 局部 时候 两个 环境 作用 信息 名词 差不多 意思 语句 过程 面的 感性认识 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 众诺网络技术有限公司 工信部10大网络安全创新 原神什么软件开发的 access中数据库 软件开发的报价单格式 软件开发员的发展 绍兴软件开发开发商 服务器主板上管理接口 潍坊市国家网络安全宣传活动 顺义数据库数据脱敏 拼多多网络安全审查 软件开发基础知识试卷 数据库考勤管理系统的物理结构 云服务器可以玩大游戏吗 关于互联网与科技有限公司 数据库增加一列递增的数列 计算机网络技术的一级类目代码 渝北区提供软件开发流程价目表 世界如何创建自己的服务器 三级数据库技术与软考初级 华什么的服务器设计公司 网络技术选择题中职水平 项目网络安全方案人员组成 国外数据库是什么意思 网络安全基础知识图片 陕西省第五届网络安全宣传周 电脑服务器停止更新 拼多多网络安全审查 数据库考勤管理系统的物理结构 校园网络安全知识讲座
0