一、闭包
我们先看一段简单的代码
// 定义一个函数fn
function fn() {
// 定义一个变量count,赋值10
let count = 10
// 返回一个函数
// 里层函数作为事件处理函数
return function() {
// count传过来的时候是10
count++
// 自增变成11
console.log(count);//输出11
}
}
// 这里fn()返回的是一个函数(上面return后面的),将这个函数赋值给放f1
let f1 = fn()
// 调用f1函数
f1()
我们再看看闭包的概念吧,简单来说闭包就是能够获取其他函数内部变量的函数。
作用:
- 相当于延长变量的作用域
- 创造一个私有化的环境
闭包的典型特征:
- 函数存在一个内部函数
- 内部函数以返回值的形式存在
- 内部函数调用了外部函数的变量
我们再看看上面的代码里层的函数是以返回值的形式存在。我们把这个函数就叫做闭包。
闭包里面里面并没有count,那么这个count是从何而来呢?显而易见这个函数是从外层的函数里面得到的。这就是闭包的一个作用,延长变量的作用域。
为什么要延长作用域呢?这个就要说到垃圾处理由于垃圾处理机制的存在,当我们在函数中声明一个变量也就是相当于开辟了一个空间,会占用内存,当我们执行这个函数后,这个空间就会被销毁从而释放内存。函数里面的这个变量的作用域就是当前的这个函数的作用域。 不在这个函数的作用域内就无法使用这个变量了。