资讯专栏INFORMATION COLUMN

一分钟学习JavaScript系列 -- 闭包

keke / 1301人阅读

摘要:此时,中定义的局部变量就被保存在内存中。所以当执行的时候,其真正的作用域是运行时的作用域运行时作用域词法作用域所以第一次调用时,由于是,所以返回而第二次返回是。因此在使用闭包时,需要非常注意内存泄漏的问题。

说起闭包,相信写前端的同学都知道,而且相信在实际的项目中或多或少都已经用到了闭包。那到底什么才是闭包,闭包又是怎么产生的呢?

1. 什么是闭包
在阮老师的文章中提到:

闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

2. 闭包的作用
一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

3. 一个简单的闭包实例

function count() {
    let num = 0;
    return function add() {
        return ++num;
    }
}
let a = count();
a();  //1
a();  //2

首先将count()的返回结果也就是count()函数里的返回的函数赋值给a。此时,count()中定义的局部变量num就被保存在内存中。当第一次调用a()时,返回++num,即1;当第二次调用a()时,由于此时num是1,所以返回的结果是2

4. 产生闭包的原因
相信很多人对这个问题都很困惑,都会认为一个函数中,返回一个函数,这样就形成了闭包。其实这仅仅是闭包产生的方法,而不是原因,下面将为大家解释原因。
产生的主要原因是因为JavaScript是词法作用域的,即在该函数定义时就已经被赋予了一个作用域。然后在运行时,又会根据实际运行情况被赋予运行时的作用域。通过这两个作用域一个JS函数才会被正确执行。
以上例为例,在执行count()的时候,该函数的作用域是

运行时作用域 num = 0
词法作用域

当count()执行时,返回add函数的时候,由于此时add处于定义状态,故返回时生成的该函数的词法作用域即为上述count()的作用域。所以当执行a()的时候,其真正的作用域是

add运行时的作用域
count运行时作用域 num = 0
count词法作用域

所以第一次调用add时,由于num是0,所以返回1;而第二次返回是2。

5. 总结
从上述的描述中,可以看出由于生成闭包的时候,外部函数的局部变量(运行时作用域)被内部函数作为词法作用域保存在内存中,故当内部函数被释放之前,该块内存是不会被释放的。因此在使用闭包时,需要非常注意内存泄漏的问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107255.html

相关文章

  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函数式编程前端掘金引言面向对象编程一直以来都是中的主导范式。函数式编程是一种强调减少对程序外部状态产生改变的方式。 JavaScript 函数式编程 - 前端 - 掘金引言 面向对象编程一直以来都是JavaScript中的主导范式。JavaScript作为一门多范式编程语言,然而,近几年,函数式编程越来越多得受到开发者的青睐。函数式编程是一种强调减少对程序外部状态产生改变的方式。因此,...

    cfanr 评论0 收藏0
  • JavasScript重难点知识

    摘要:忍者级别的函数操作对于什么是匿名函数,这里就不做过多介绍了。我们需要知道的是,对于而言,匿名函数是一个很重要且具有逻辑性的特性。通常,匿名函数的使用情况是创建一个供以后使用的函数。 JS 中的递归 递归, 递归基础, 斐波那契数列, 使用递归方式深拷贝, 自定义事件添加 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果...

    forsigner 评论0 收藏0
  • JavaScript - 收藏集 - 掘金

    摘要:插件开发前端掘金作者原文地址译者插件是为应用添加全局功能的一种强大而且简单的方式。提供了与使用掌控异步前端掘金教你使用在行代码内优雅的实现文件分片断点续传。 Vue.js 插件开发 - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins译者:jeneser Vue.js插件是为应用添加全局功能的一种强大而且简单的方式。插....

    izhuhaodev 评论0 收藏0
  • JS笔记

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。异步编程入门的全称是前端经典面试题从输入到页面加载发生了什么这是一篇开发的科普类文章,涉及到优化等多个方面。 TypeScript 入门教程 从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript。 网络基础知识之 HTTP 协议 详细介绍 HTT...

    rottengeek 评论0 收藏0
  • 前端补集 - 收藏集 - 掘金

    摘要:原文地址一个非常适合入门学习的博客项目前端掘金一个非常适合入门学习的项目,代码清晰结构合理新闻前端掘金介绍一个由编写的新闻。深入浅出读书笔记知乎专栏前端专栏前端掘金去年的一篇老文章,恰好今天专栏开通,迁移过来。 破解前端面试(80% 应聘者不及格系列):从闭包说起 - 掘金修订说明:发布《80% 应聘者都不及格的 JS 面试题》之后,全网阅读量超过 6W,在知乎、掘金、cnodejs ...

    YorkChen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<