[JS]什么是闭包?
首先来思考一下下面的案例:
function unclosure() {
let count = 0
return count++
}
for (let index = 0; index < 10; index++) {
let result = unclosure()
console.log(result)
}
我在函数内实现一个很简单的计数器功能,希望在最后得到一个成功累加之后的数字。unclosure 函数是没有利用闭包写的计数器。
通过 for 的10次循环,打印 result,当我们打开浏览器运行这一段代码之后:

unclosure 函数被重复调用了10次,每次的 count 变量都不会成为下一次函数计数时使用的那个 count 变量。也就是说,每次函数重新运行的时候,此 count 变量非上一次 count 变量,所以,对于下一次函数运行时面对的 count 变量初始值为 0。那么,应该如何解决这个问题呢?
一般会想到把 count 变量提到 unclosure 函数体之外,这样做是肯定可以的。实际上,这样的操作已经是在利用闭包了。让我们改造上面的案例:
let count = 0
function unclosure() {
return count++
}
一个函数体内引用了外部的变量时,函数就会形成一个闭包。直到这个函数结束运行,闭包也会随之消失。闭包形成一个持续的环境,闭包内的所有资源都将持续存在着,所以,上面的例子会成功进行累加。
如果不把变量提取到函数体外,直接就在函数里面运行也是可以的,应该如何制造一个闭包呢?
函数引用了外部的变量时,就会形成一个闭包。一句这一结论,我们真的可以在第一个案例中制造一个闭包,来解决最先出现的问题。
function closure() {
let count = 0
console.log('closure 函数初始化了一次')
return function () {
return count++
}
}
let inner = closure() // 得到一个闭包
for (let index = 0; index < 10; index++) {
let result = inner()
console.log(result)
}
closure 函数的内部嵌套了一个匿名函数(也可以嵌套有名函数)。相对于匿名函数来说,它引用了外部函数 closure 的变量 count,这就形成了一个闭包了。
在运行这段代码之前,我们需要得到 closure 函数的闭包(不要重复得到一个新的闭包,因为会初始化这个环境,回到上诉提到的问题)。最后反复执行 inner() 就可以实现累加了。

[JS]什么是闭包?的更多相关文章
- 详解js中的闭包
前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...
- js中的闭包之我理解
闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...
- Js(javaScript)的闭包原理
问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 小编 ...
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- js中的“闭包”
js中的“闭包” 姓名:闭包 官方概念:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的 ...
- JS中的闭包(closure)
JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用 ...
- Js中的闭包原理
要了解清楚js中的闭包制机,那么得先了解全局执行环境.块级执行环境.函数执行环境.变量对象.环境栈.作用域链.摧毁执行环境. 全局执行环境 全局执行环境指的是最外层的执行环境.在web中全局执行环境被 ...
- js中的闭包理解一
闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...
- JS基础学习——闭包
JS基础学习--闭包 什么是闭包 闭包的定义如下,它的意思是闭包使得函数可以记住和访问它的词法范围,即使函数是在它声明的词法范围外执行.更简单来讲,函数为了自己能够正确执行,它对自己的词法范围产生闭包 ...
- JS面向对象之闭包
闭包 闭包的概念 闭包的含义就是闭合,简单来说就是一个具有封闭功能的结构 闭包就是具有封闭的对外不公开的,包裹结构或空间 在 js 中的闭包 在 js 中函数可以构成闭包 函数是一个代码结构的封闭结构 ...
随机推荐
- AT2567-[ARC074C]RGB Sequence【dp】
正题 题目链接:https://www.luogu.com.cn/problem/AT2567 题目大意 长度为\(n\)的包含三种颜色\(RGB\)的序列,\(m\)个限制\([l,r,k]\)表示 ...
- AT4119-[ARC096C]Everything on It【斯特林数,容斥】
正题 题目链接:https://www.luogu.com.cn/problem/AT4119 题目大意 一个集合\(S=\{k\in[1,n]\cup N\}\),它的所有子集作为元素组成的集合中要 ...
- Visual Studio 6.0 在 Windows 10 下崩溃的一种解决方法
Visual Studio 6.0 下载地址: https://winworldpc.com/product/microsoft-visual-stu/60 安装步骤: https://www.cod ...
- 程序员微机课系列—我的nodejs多版本管理方法
nodejs的多版本配置对于我来说一直都是一个较为头疼的事情.本人的开发工作会涉及electron以及前端,对于工作中使用的npm包(点名node-sqlite3和node-sass)在某些情况下,会 ...
- CF125E MST company (凸优化+MST)
qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...
- JavaScript表单输入合法控制
写在前面 为了提高数据输入的容错性和数据库数据的安全性,除了后端对输入的数据的逻辑判断处理,还可以前端页面高效率处理,从而提高系统的可靠性,下面是这次项目中的自己写的一些符合当时需要的控制. 账号位数 ...
- fastjson反序列化-JdbcRowSetImpl利用链
fastjson反序列化-JdbcRowSetImpl利用链 JdbcRowSetImpl利用链 fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs. ...
- [no_code][Beta]发布声明报告
$( "#cnblogs_post_body" ).catalog() 软件下载 一个全新的超简易的OCR表单识别工具 轻松拍照,实现手写表格识别 一键打开,支持多种应用打开你的表 ...
- Uniapp云打包生成apk下载链接
使用uni[]()app云打包生成安装包下载链接 manifest.json 中配置自动获取appid manifest.json中配置app 图标 按教程生成.keystore证书 使用云打包生成安 ...
- 简明教程 | Docker篇 · 其一:基础入门
了解Docker Docker是什么 Docker是指容器化技术,用于支持创建和使用 Linux 容器,同时Docker也是软件容器平台. 什么是容器(container) 容器是主机上与其他进程隔离 ...