- 前言
- 关于 ECMASCRIPT 发展史和现状
- ES6 带来的重大特性
- ES2016(ES7)的改进
- ES2017(ES8)带来的重大新特性
- ES2018(ES9)带来的重大新特性
- JavaScript 编码风格指南
- JavaScript 词法结构(构建块)
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 表达式
- 原型继承
- 如何使用 JavaScript 中的 Classes(类)
- JavaScript 异常处理
- JavaScript 中的分号(;)
- JavaScript 中的引号
- JavaScript 字面量模板(Template Literals)指南
- JavaScript 中的 function(函数)
- JavaScript 箭头函数(Arrow Function)
- JavaScript 中的闭包(Closures)
- JavaScript 数组(Arrays)
- JavaScript 中的循环(Loops)
- JavaScript 中的事件(Events)
- JavaScript 中的事件循环(Event Loop)
- JavaScript 异步编程和回调
- 理解 JavaScript 中的 Promises
- 用 async 和 await 编写现代 JavaScript 异步代码
- JavaScript 中的 循环(Loops) 和 作用域(Scope)
- JavaScript 定时器 setTimeout() 和 setInterval()
- JavaScript 中的 this
- JavaScript 严格模式(Strict Mode)
- JavaScript 中的 立即执行函数表达式(IIFE)
- JavaScript 中的数学运算符
- JavaScript 中的 Math 对象
- 介绍 ES Modules(模块)
- 介绍 CommonJS
- JavaScript 术语表
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
JavaScript 中的闭包(Closures)
这是对闭包主题的一个简单介绍,闭包是理解 JavaScript 函数如何工作的关键。
如果你曾经用 JavaScript 编写过函数,那么你已经使用了闭包。
这是一个需要理解的关键主题,它会影响你所做的事情。
当一个函数运行时,它执行在定义它时的作用域中,而不是在执行它时所处的状态。
作用域基本上可以理解为可见的变量集合。
函数会记住其词法作用域,并且能够访问在父作用域中定义的变量。
简而言之,函数有一整套可以访问的变量。
让我立即举一个例子来验证这一点。
const bark = dog => { const say = `${dog} barked!` ;(() => console.log(say))() } bark(`Roger`)
按照预期在控制台中打印 Roger barked!
如果您想要返回操作,该怎么办呢:
const prepareBark = dog => { const say = `${dog} barked!` return () => console.log(say) } const bark = prepareBark(`Roger`) bark()
这段代码还是在控制台中打印 Roger barked!
让我们做最后一个例子,它将 prepareBark
重用于两只不同的 dog:
const prepareBark = dog => { const say = `${dog} barked!` return () => { console.log(say) } } const rogerBark = prepareBark(`Roger`) const sydBark = prepareBark(`Syd`) rogerBark() sydBark()
打印结果:
Roger barked! Syd barked!
如您所见,变量 say
的状态与从 prepareBark()
返回的函数相关联。
还要注意我们第二次调用 prepareBark()
时重新定义一个新的 say 变量,但这不会影响第一个 prepareBark()
作用域的状态。
这就是闭包的工作原理:返回的函数将保持作用域里的初始状态。
了解闭包更多知识请阅读: JavaScript 核心概念之作用域和闭包
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论