diff --git a/docs/async.md b/docs/async.md index 214e7f9..2a6dbc4 100644 --- a/docs/async.md +++ b/docs/async.md @@ -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 对象也可以做到这一点。 diff --git a/docs/function.md b/docs/function.md index bc625ba..651a598 100644 --- a/docs/function.md +++ b/docs/function.md @@ -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 diff --git a/docs/set-map.md b/docs/set-map.md index 3decf28..6957090 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -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`。