前言
函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)。也就是说,闭包
可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。
— MDN Web docs
什么是“闭包”
在MDN JavaScript官方文档上对“闭包”的描述是:函数与其状态即词法环境的引用,共同构成闭包。用更通俗的话来讲就是:闭包就是能够读取其他函数内部变量的函数。简单来说,闭包是一种函数,一种定义在函数内部的函数。本质上,闭包就是将函数内部和外部连接在一起的一座桥梁。
例子🌰:
1 | function func1(){ |
其中 func2函数,就是闭包。
闭包的作用
- 在外部能够读取函数内部的变量。
- 使变量的值一直存在于内存当中。
- 使用闭包模拟私有方法。
示例代码:
1 | function func1(){ |
闭包会产生的问题(注意事项)
- 由于闭包会使得函数中的变量都被保存在内存之中,即使函数已经执行完毕,这些局部变量也不会被垃圾回收器自动回收,有某些环境下容易导致内存泄漏。正确做法是,在退出函数之前,将不使用的变量都删除清空。
- 闭包会改变函数的值,而不只是改变函数变量的一个副本。
- 循环闭包问题。
引用
本文参考: