JavaScript 基础知识(二):闭包
首先来思考一下下面的案例:
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() 就可以实现累加了。
JavaScript 基础知识(二):闭包的更多相关文章
- 快速掌握JavaScript面试基础知识(二)
译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...
- Javascript基础知识总结一
Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
- JavaScript基础笔记二
一.函数返回值1.什么是函数返回值 函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- JavaScript 基础知识 - BOM篇
前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理
菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...
- Dapper基础知识二
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper? 首先Dapper是支持多种数据库的 ...
- python基础知识(二)
python基础知识(二) 字符串格式化 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 print(' %s is boy'%('tom')) ----> ...
随机推荐
- 解决WIN7无法安装高版本Node.js问题
网上很多文章都让去安装低版本node 由于业务需求,低版本node npm 有一些包支持的不好 npm出cb() never call 本着更新npm 顺带弄个高版本的node 单独更新npm npm ...
- c++ 超长整数加法 高精度加法
c++ 超长整数加法 高精度加法 实现思路 不能直接使用加法,因为int和long long都已超出最大数据表示范围 数据读入采用string类型,读入后将数据的每一位存储到vector中 vecto ...
- rhel6下eth1恢复eth0
问题:VMware 虚拟机中,从模板克隆出来的虚拟机的网卡名都会变成为eth1,而程序或者脚本,默认网卡是eth0,这时需要将eth1改为eth0. 原因:/etc/udev/rules.d/70-p ...
- 9.4 苹果macOS电脑如何安装Android开发环境(Android Studio)
下载 来到官方下载界面(需要 科 学 上 网),下载最新版本,点击Download,然后同意协议,在点击下载:如果平常看文档,可以点击Google中国Android开发者官网(部分用户可能也需要科 学 ...
- NC14326 Rails
NC14326 Rails 题目 题目描述 There is a famous railway station in PopPush City. Country there is incredibly ...
- labview从入门到出家9(进阶篇)--串口通讯
Labview在工控领域,如产线,实验室等环境用得较多,其中与仪器通讯控制的方式有串口(RS232,RS485,TTL),GPIB,网口,CAN等,其中串口在仪器还有单片机控制中用来调试居多.(很 ...
- Iterator接口介绍和迭代器的代码实现
定义:Iterator接口是Java集合框架中的一员. 作用:Collection接口与Map接口主要用于存储元素. 常用方法: boolen hasNext(); //判断游标右边是否还有元 ...
- IDEA的概述和IDEA的安装
开发工具概述 IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量. 它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中 ...
- Test_day01月_总结
1)Object是所有类的超类,在java.lang包中 2)标识符命名规则 3)八种基本数据类型有哪些?每种类型所占的字节数? 整数直接量默认为int类型 浮点数直接量默认为double类型 4)字 ...
- 【一本通基础DP基础模型】摘花生
题面 题目描述 Hello Kitty想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来.地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生, ...