mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-28 21:32:20 +00:00
docs(function): edit default parameter
This commit is contained in:
parent
8b9202cd6c
commit
e1cb574009
@ -468,25 +468,29 @@ function run(fn) {
|
|||||||
next();
|
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
|
```javascript
|
||||||
var gen = function* (){
|
var g = function* (){
|
||||||
var f1 = yield readFile('fileA');
|
var f1 = yield readFile('fileA');
|
||||||
var f2 = yield readFile('fileB');
|
var f2 = yield readFile('fileB');
|
||||||
// ...
|
// ...
|
||||||
var fn = yield readFile('fileN');
|
var fn = yield readFile('fileN');
|
||||||
};
|
};
|
||||||
|
|
||||||
run(gen);
|
run(g);
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,函数`gen`封装了`n`个异步的读取文件操作,只要执行`run`函数,这些操作就会自动完成。这样一来,异步操作不仅可以写得像同步操作,而且一行代码就可以执行。
|
上面代码中,函数`g`封装了`n`个异步的读取文件操作,只要执行`run`函数,这些操作就会自动完成。这样一来,异步操作不仅可以写得像同步操作,而且一行代码就可以执行。
|
||||||
|
|
||||||
Thunk函数并不是Generator函数自动执行的唯一方案。因为自动执行的关键是,必须有一种机制,自动控制Generator函数的流程,接收和交还程序的执行权。回调函数可以做到这一点,Promise 对象也可以做到这一点。
|
Thunk函数并不是Generator函数自动执行的唯一方案。因为自动执行的关键是,必须有一种机制,自动控制Generator函数的流程,接收和交还程序的执行权。回调函数可以做到这一点,Promise 对象也可以做到这一点。
|
||||||
|
|
||||||
|
@ -255,6 +255,20 @@ function f(y = x) {
|
|||||||
f() // ReferenceError: x is not defined
|
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`,而是全局作用域。请看下面的例子。
|
如果函数`A`的参数默认值是函数`B`,由于函数的作用域是其声明时所在的作用域,那么函数`B`的作用域不是函数`A`,而是全局作用域。请看下面的例子。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -705,9 +705,9 @@ let map2 = new Map(
|
|||||||
此外,Map还有一个`forEach`方法,与数组的`forEach`方法类似,也可以实现遍历。
|
此外,Map还有一个`forEach`方法,与数组的`forEach`方法类似,也可以实现遍历。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
map.forEach(function(value, key, map)) {
|
map.forEach(function(value, key, map) {
|
||||||
console.log("Key: %s, Value: %s", key, value);
|
console.log("Key: %s, Value: %s", key, value);
|
||||||
};
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
`forEach`方法还可以接受第二个参数,用来绑定`this`。
|
`forEach`方法还可以接受第二个参数,用来绑定`this`。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user