闭包是什么?
什么场景需要闭包?
闭包可能导致什么问题?
闭包是什么?
【定义】闭包是函数和声明该函数的词法环境的组合。
定义和实例来自MDN官网:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
刚刚是官方的定义和官方的示例,标准答案是已经给出了
闭包的使用场景?
仍然是官方的例子,这个例子就不是纯粹为了解释含义了,这个例子展示了利用闭包快速实现工厂模式 ( https://baike.baidu.com/item/%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/9852061 )
另一个比较常用的使用场景是私有,私有就是面向对象三要素中的【封装】(另外两个要素是【继承】和【多态】),简单理解私有可以参考TypeScript中的例子
简单说就是私有不允许在类的外部直接使用,必须通过公有方法进行修改和获取
这个是MDN官方的闭包实现私有的例子,但我觉得类的实例就要用new才对,所以另做了一个例子
对应的不使用闭包
闭包存在的问题?
最大的问题在于内存管理,正常来讲你的函数运行完了除了返回值不销毁其他的函数内申请的东西都可以清理,现在用了闭包就不一定了,是否还记得官方说明里加粗加黑的那一段话?
来点实际体验的吧,试着运行以下代码并关注你的内存占用
看看运行的结果
https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-handle-4-common-memory-leaks-3f28b94cfbec,例子来源于老外的这篇文章,其中也详细讲解了内存泄露的原因,这篇文章我翻译过
JavaScript是如何工作的:内存管理+如何处理4种常见的内存泄漏
,这可能需要对JS运行时知识的储备,这方面可以看看我之前翻译的【译】JavaScript是如何工作的:引擎概述,运行时和调用堆栈
闭包在JS的地位应该接近递归在程序设计中的地位了,用对了就模式用错了就反模式。其实一直都想免写这闭包种的文章,很多人都在讨论,也有很多人介绍的很好了,只是这道题确实很重要。
领取专属 10元无门槛券
私享最新 技术干货