1 概念
一个函数对周围状态的引用,捆绑在一起,内层函数中可以访问到外层函数的作用域。
简单理解:闭包 = 内层函数 + 外层函数的变量
先看个简单的代码:
function outer() {let a = 1function inner() {console.log(a)}
}
outer()
2 闭包的作用
封装数据,提供给操作,外部也可以访问函数内部的变量
3 闭包的基本格式
function outer() {let a = 1function inner() {console.log(a)}return inner
}
const fn = outer()
fn()
4 闭包的应用
可以实现数据的私有化
1. 案例:比如我们需要统计函数调用的次数时,函数调用一次,次数就 ++
let count = 0;function fn() {count++console.log(`函数被调用了${count}次`)}fn() // 1次fn() // 2次
但是现在count属于全局变量,很容易被篡改, 比如现在,我将count篡改为100
所以上述定义为全局变量,就很容易被修改,接下来就可以使用闭包来解决容易被篡改的问题了。
2. 使用闭包实现数据私有化:
function count() {let count = 0function fn() {count++console.log(`函数被调用了${count}次`)}return fn}const fn = count()fn() // 1次fn() // 2次
这时,当我们每调用一次函数时,都是从下面的位置开始执行的,属于函数内部,不会受到外部的影响。
5 闭包存在的问题
会产生内存泄漏
比如以下示例代码:
function count() {let count = 0function fn() {count++console.log(`函数被调用了${count}次`)}return fn}const fn = count()fn() // 1次fn() // 2次
采用标记清除法来判断上述变量count是否能够被回收
所以当这段代码执行完时,count应该是被回收的,但是没有被回收,这种就会造成内存泄漏。
想要了解js的垃圾回收机制的可以参考:http://t.csdnimg.cn/TGyFE