Skip to content

Commit 75a986b

Browse files
committed
docs(types/function): edit closure wangdoc#204
1 parent 2403863 commit 75a986b

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

docs/types/function.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ f.toString()
277277
// }
278278
```
279279

280+
上面示例中,函数`f``toString()`方法返回了`f`的源码,包含换行符在内。
281+
280282
对于那些原生的函数,`toString()`方法返回`function (){[native code]}`
281283

282284
```javascript
@@ -319,6 +321,8 @@ multiline(f);
319321
// 多行注释"
320322
```
321323

324+
上面示例中,函数`f`内部有一个多行注释,`toString()`方法拿到`f`的源码后,去掉首尾两行,就得到了一个多行字符串。
325+
322326
## 函数作用域
323327

324328
### 定义
@@ -740,7 +744,7 @@ result(); // 999
740744

741745
闭包就是函数`f2`,即能够读取其他函数内部变量的函数。由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如`f2`记住了它诞生的环境`f1`,所以从`f2`可以得到`f1`的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
742746

743-
闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。
747+
闭包的最大用处有两个,一个是可以读取外层函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。
744748

745749
```javascript
746750
function createIncrementor(start) {
@@ -758,7 +762,7 @@ inc() // 7
758762

759763
上面代码中,`start`是函数`createIncrementor`的内部变量。通过闭包,`start`的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包`inc`使得函数`createIncrementor`的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。
760764

761-
为什么会这样呢?原因就在于`inc`始终在内存中,而`inc`的存在依赖于`createIncrementor`,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收
765+
为什么闭包能够返回外层函数的内部变量?原因是闭包(上例的`inc`)用到了外层变量(`start`),导致外层函数(`createIncrementor`)不能从内存释放。只要闭包没有被垃圾回收机制清除,外层函数提供的运行环境也不会被清除,它的内部变量就始终保存着当前值,供闭包读取
762766

763767
闭包的另一个用处,是封装对象的私有属性和私有方法。
764768

0 commit comments

Comments
 (0)