1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-27 20:32:21 +00:00

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

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 对象也可以做到这一点。

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

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`