docs(function): edit default parameter

This commit is contained in:
ruanyf
2016-07-22 17:15:38 +08:00
parent 8b9202cd6c
commit e1cb574009
3 changed files with 26 additions and 8 deletions
+10 -6
View File
@@ -468,25 +468,29 @@ function run(fn) {
next();
}
run(gen);
function* g() {
// ...
}
run(g);
```
上面代码的run函数,就是一个Generator函数的自动执行器。内部的next函数就是Thunk的回调函数。next函数先将指针移到Generator函数的下一步(gen.next方法),然后判断Generator函数是否结束(result.done 属性),如果没结束,就将next函数再传入Thunk函数(result.value属性),否则就直接退出。
上面代码的`run`函数,就是一个Generator函数的自动执行器。内部的`next`函数就是Thunk的回调函数。`next`函数先将指针移到Generator函数的下一步(`gen.next`方法),然后判断Generator函数是否结束(`result.done`属性),如果没结束,就将`next`函数再传入Thunk函数(`result.value`属性),否则就直接退出。
有了这个执行器,执行Generator函数方便多了。不管有多少个异步操作,直接传入`run`函数即可。当然,前提是每一个异步操作,都要是Thunk函数,也就是说,跟在`yield`命令后面的必须是Thunk函数。
有了这个执行器,执行Generator函数方便多了。不管内部有多少个异步操作,直接把Generator函数传入`run`函数即可。当然,前提是每一个异步操作,都要是Thunk函数,也就是说,跟在`yield`命令后面的必须是Thunk函数。
```javascript
var gen = function* (){
var g = function* (){
var f1 = yield readFile('fileA');
var f2 = yield readFile('fileB');
// ...
var fn = yield readFile('fileN');
};
run(gen);
run(g);
```
上面代码中,函数`gen`封装了`n`个异步的读取文件操作,只要执行`run`函数,这些操作就会自动完成。这样一来,异步操作不仅可以写得像同步操作,而且一行代码就可以执行。
上面代码中,函数`g`封装了`n`个异步的读取文件操作,只要执行`run`函数,这些操作就会自动完成。这样一来,异步操作不仅可以写得像同步操作,而且一行代码就可以执行。
Thunk函数并不是Generator函数自动执行的唯一方案。因为自动执行的关键是,必须有一种机制,自动控制Generator函数的流程,接收和交还程序的执行权。回调函数可以做到这一点,Promise 对象也可以做到这一点。
+14
View File
@@ -255,6 +255,20 @@ function f(y = x) {
f() // ReferenceError: x is not defined
```
下面这样写,也会报错。
```javascript
var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined
```
上面代码中,函数`foo`的参数`x`的默认值也是`x`。这时,默认值`x`的作用域是函数作用域,而不是全局作用域。由于在函数作用域中,存在变量`x`,但是默认值在`x`赋值之前先执行了,所以这时属于暂时性死区(参见《let和const命令》一章),任何对`x`的操作都会报错。
如果函数`A`的参数默认值是函数`B`,由于函数的作用域是其声明时所在的作用域,那么函数`B`的作用域不是函数`A`,而是全局作用域。请看下面的例子。
```javascript
+2 -2
View File
@@ -705,9 +705,9 @@ let map2 = new Map(
此外,Map还有一个`forEach`方法,与数组的`forEach`方法类似,也可以实现遍历。
```javascript
map.forEach(function(value, key, map)) {
map.forEach(function(value, key, map) {
console.log("Key: %s, Value: %s", key, value);
};
});
```
`forEach`方法还可以接受第二个参数,用来绑定`this`