本文主要记录了自己关于闭包的理解,和闭包的应用
闭包的概念
闭包,就是函数在调用的时候,产生的那个内存结构,外界不能访问里面,它就是一个封闭的包裹结构,即闭包。
注意
- 函数定义后,放置在那里,只是一个普通的对象,不会创建任何内存,也不会影响到其他任何东西;
- 只有函数运行起来,在函数执行过程中,在 结束之前,函数会构成一个封闭的空间;
- 根据词法作用域,函数内在访问变量的时候,如果函数内没有可以到函数外面查找,反之不行;
- 同时函数也包含了一定的范围;
- 结合一下, 此时在函数结束之前,函数构成了一个封闭的包裹的结构,此为闭包。
如何保留函数内存的访问能力
函数在执行完之后,会释放其占用的内存。
如果可以让函数调用之后,不释放其内存,这个闭包才会有作用。
函数执行结束之后,如果保存其内存的访问能力,该内存就不会被释放。
闭包要使用,有一个经典的代码,一定要有:
|
|
思考:
闭包到底构成了什么东西(有闭包和没有闭包有什么不同,闭包给我们提供了一个什么样的功能)?
|
|
思考:函数就是闭包?
这种理解并不准确。当函数 **被调用** 的时候,才会产生闭包。
举个例子,有一个铅笔,把它放在头发上来回摩擦,摩擦这个动作会产生静电。
但如果把铅笔放在桌子上,啥也不做,就不会产生静电。
而且摩擦产生静电之后,如果不继续保持摩擦,静电就会消失。因此我们需要保持持续的摩擦。
闭包的几种应用
1.沙箱模式
那么什么是沙箱呢?
|
|
我们知道,自己在封装一些东西的时候,容易出现 全局污染.
我们可以把其放到一个沙箱中,留出一个允许别人使用的 接口( 函数, 对象 ) . 我们的代码不会或者最小程度的影响到外界代码。
如何构成沙箱呢,我们可以使用下面的代码构成沙箱
|
|
沙箱模式 可以保证数据内外隔离,但在实际开发中,我们需要预留一些 api 以供外界调用,有几个常见的返回模型。
1.利用 返回值,返回一个 接口
|
|
2.利用 window 的属性返回多个数据
|
|
3.利用 函数的调用中的函数调用模式
函数在调用的时候,默认 函数中的 this 就是 window. 因此第二种写法有一个变体:
|
|
2. 利用闭包实现私有作用域(带私有作用域的函数)
代码模型:
|
|
让我们来看一个例子:
需求:
1> 将骆驼命名规则的字符串转换成使用 连字符连接的 字符串, 并且全小写
例如: 'getElementById' => 'get-element-by-id'
2> 将用连字符连接的字符串, 转成骆驼命名规则的字符串, 例如:
'get-element-by-id' => 'getElementById'
|
|
3.保留运行时的数据
–> 闭包 是函数在执行过程中产生的一个私有的内存空间
这个内存空间如果在函数执行结束后不释放,也可以保留数据
|
|
利用这点,我们可以使用闭包实现0-9的打印
|
|