wei771783057
2020-10-07 17:21:36 +08:00
严格意义上讲,闭包只有一条定义就是 函数引用了外部变量 。
所以其实你平常普通函数只要引用了全局变量就形成闭包了,只不过这是全局层面的,
而一般的形式是 1,一个包裹函数内的函数引用了这个包裹函数内部词法作用域它自身外的变量,如果在包裹函数内这个函数直接就运行了,那就是形成了调用执行栈,然后执行完立马出栈 等垃圾回收 GC 后引用的变量内存就清理掉了,2,但我们一般狭义上闭包指的是包裹函数把这个内部函数返回赋给其他变量,但由于这个内部函数它引用了包裹内它自身外部作用域变量,导致在执行栈依次进出后,被引用的包裹内部变量无法被 GC,这就形成了所谓闭包。
一般作用
1,形成内部私有变量,无法被直接访问,必须通过引用它的内部函数获取,可以进行一系列读写访问控制。
2,制作偏函数,比如 bind,可以接受一些预设参数值,返回一个会用到它们的函数,还有类似的像柯里化,将一个接受多个参数的函数转换成接受单一参数并返回一个接收剩余参数返回结果的函数。
3,高阶函数,像组合函数 compose,把函数作为参数传入,内部实现其调用形式返回结果,还有像制作防抖节流函数也都是闭包的应用 都是通过预设的参数作为闭包变量返回一个引用它的函数来实现的功能。
另外 class 类私有字段还在 tc39 提案中,不过 class 还是不太受待见,毕竟只是 prototype 的语法糖而且并不完备,js 社区感觉还是更偏向 FP 一些,,,