一、怎么理解闭包?
简单理解:闭包 = 内层函数 + 外层函数的变量
下面是一组简单的闭包代码:
function outer() {let count = 1function inner() {console.log(count)}inner()
}
outer()
闭包有两个注意点:
- 闭包一定有return吗?(不一定)
- 闭包一定会有内存泄露吗?(不一定)
先来回答第一个,例如上面那一组简单的闭包代码就没有用到return。
1、闭包什么时候用到return?
外部如果想要使用闭包的变量,则此时就需要return内层变量
function outer() {let count = 1function inner() {count++console.log(count)}return inner}const x = outer()console.log(x)x()
闭包应用:能够实现数据的私有化。
例如:统计函数的调用次数。
1、一般写法
let count=1
function fun(){count++console.log('函数被调用了$`{count}次`')
}
fun() // 2
fun() // 3
此时的count是全局变量,很容易被修改,一旦被修改,就无法统计函数的调用次数了。
闭包写法:
javascript
function fn() {let count=1function fun(){count++console.log('函数被调用了$`{count}次`')}return fun
}
const result=fn()
result() //2
result() //3> 这样就实现了数据私有
缺点:闭包会导致内存泄漏:
上面代码中count变量会导致内存泄漏。
result是一个全局变量,代码执行完毕不会立即销毁
而result使用fn函数
fn函数又返回fun函数
fun函数里面用到count
因此count被引用不会被回收,所以一直存在