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:
parent
8b9202cd6c
commit
e1cb574009
@ -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 对象也可以做到这一点。
|
||||
|
||||
|
@ -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
|
||||
|
@ -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`。
|
||||
|
Loading…
x
Reference in New Issue
Block a user