File tree Expand file tree Collapse file tree 1 file changed +6
-2
lines changed Expand file tree Collapse file tree 1 file changed +6
-2
lines changed Original file line number Diff line number Diff line change @@ -277,6 +277,8 @@ f.toString()
277
277
// }
278
278
```
279
279
280
+ 上面示例中,函数` f ` 的` toString() ` 方法返回了` f ` 的源码,包含换行符在内。
281
+
280
282
对于那些原生的函数,` toString() ` 方法返回` function (){[native code]} ` 。
281
283
282
284
``` javascript
@@ -319,6 +321,8 @@ multiline(f);
319
321
// 多行注释"
320
322
```
321
323
324
+ 上面示例中,函数` f ` 内部有一个多行注释,` toString() ` 方法拿到` f ` 的源码后,去掉首尾两行,就得到了一个多行字符串。
325
+
322
326
## 函数作用域
323
327
324
328
### 定义
@@ -740,7 +744,7 @@ result(); // 999
740
744
741
745
闭包就是函数` f2 ` ,即能够读取其他函数内部变量的函数。由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如` f2 ` 记住了它诞生的环境` f1 ` ,所以从` f2 ` 可以得到` f1 ` 的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
742
746
743
- 闭包的最大用处有两个,一个是可以读取函数内部的变量 ,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。
747
+ 闭包的最大用处有两个,一个是可以读取外层函数内部的变量 ,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。
744
748
745
749
``` javascript
746
750
function createIncrementor (start ) {
@@ -758,7 +762,7 @@ inc() // 7
758
762
759
763
上面代码中,` start ` 是函数` createIncrementor ` 的内部变量。通过闭包,` start ` 的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包` inc ` 使得函数` createIncrementor ` 的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。
760
764
761
- 为什么会这样呢?原因就在于 ` inc ` 始终在内存中,而 ` inc ` 的存在依赖于 ` createIncrementor ` ,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收 。
765
+ 为什么闭包能够返回外层函数的内部变量?原因是闭包(上例的 ` inc ` )用到了外层变量( ` start ` ),导致外层函数( ` createIncrementor ` )不能从内存释放。只要闭包没有被垃圾回收机制清除,外层函数提供的运行环境也不会被清除,它的内部变量就始终保存着当前值,供闭包读取 。
762
766
763
767
闭包的另一个用处,是封装对象的私有属性和私有方法。
764
768
You can’t perform that action at this time.
0 commit comments