闭包是什么
- 闭包是有权访问其他函数作用域的局部变量的 一个函数(定义)
- 由于在Js 中,变量的作用域也是函数的作用域,所以会随着函数的执行完毕 , 作用域也会被清除,内存随之被回收。但是由于闭包是建立在函数内部的子函数,因其可以访问上级函数的作用域的特性,即使函数执行完,作用域也不会随着销毁,这时的子函数---即闭包,也就拥有可以访问上级作用域中变量的权限,即使上级函数执行完,作用域也不会被销毁,内存也不会被回收。因为上级作用域依然有变量可以被访问(理解)
闭包解决了什么
- 本质上,闭包就是把函数内部和函数外部连接起来的一座桥梁(阮一峰)
- 由于闭包可以缓存上级作用域,使得函数外部打破了函数作用域的束缚,可以访问函数内部的变量。开发者可以不用去学习钩子函数来操作上级函数作用域内部的变量了。
闭包的好处
- 可以读取函数内部的变量
- 可以将函数的局部变量长久保存在内存中
闭包有哪些应用场景
Ajax请求的成功回调,事件绑定的回调 , setTimeout的延时回调,一个函数内部返回一个匿名函数等等。简而言之,无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时,都有闭包的身影。
使用闭包注意什么
- 代码难以维护: 闭包内部是可以访问上级作用域,而如果闭包时异步执行的话,就要清楚上级作用域发生了什么,这样就需要对Js的运行机制和代码的运行逻辑相当了解才行
- 由于闭包会使函数的变量都保存在内存中,所以会占用大量的内存,从而影响网页的性能,所以不能滥用闭包(解决办法:在退出函数之前,将不再使用的局部变量全部删除)
- 内存泄露:程序运行需要内存,对于持续运行的程序要及时释放不需要的内存,否则内存占用将越来越高,轻则影响系统高性能,重则造成程序崩溃。不用到的内存没有及时释放,就叫做内存泄漏。