闭包
函数式编程的世界中,闭包的作用等价于面向对象编程中的类!
- 闭包可以认为是携带状态的函数,它能让其中的临时变量的生命周期得到无限的延长,因为闭包函数的执行周期是无限的!
- 闭包每次返回的函数都是一个全新的函数实例对象,但是对于这些新的函数实例对象,外部函数的临时变量是唯一的,即是所有函数实例对象所共享的!
- 闭包能够对临时变量进行封装,使其达到私有变量的效果,外部代码无法访问到(函数科里化)!
外部函数变量的临时状态
1 | function count() { |
上面调用三个匿名函数的结果都是16,而不是1,3, 9。原因在于闭包函数中并没有保存外部函数中变量i在循环时的临时状态,当循环结束后,arr才被返回,此时循环已经执行结束了,i的值为4。
保存外部函数的临时变量的临时状态,通过参数传递进来,保存进行闭包函数中!
1 | function count() { |
科里化:函数封装私有变量
JavaScript中没有class机制,所以无法封装自己的private属性的成员变量。借助闭包函数的科里化,可以实现在外部函数中对临时变量进行隐藏!
1 | 'use strict'; |
科里化:
1 | 'use strict'; |
闭包函数每次调用都会创建一个新函数
1 | function lazy_sum(arr) { |