Generator 函数语法
2019-12-05 09:56:20 0 举报
AI智能生成
ES6 - 思维导图
作者其他创作
大纲/内容
Generator.prototype.throw
1、可在函数体外抛出错误<br>由Generator函数体内catch错误<br>2、throw方法被捕获以后,<br>会附带执行下一条yield表达式<br>3、旦 Generator 执行过程中抛出错误<br> 且没有被内部捕获,就不会再执行下去了<br>4、throw方法抛出的错误要被内部捕获,<br>前提是必须至少执行过一次next方法<br><br>
Generator.prototype.return()
return方法,可以返回给定的值,<br>并且终结遍历 Generator 函数
g.return('foo') <br>// { value: "foo", done: true }
try...finally
如果 Generator 函数内部有try...finally代码块,<br>且正在执行try代码块,那么return方法会导致<br>立刻进入finally代码块,执行完以后,整个函数才会结束
yield* 表达式
用来在一个 Generator 函数里面<br>执行另一个 Generator 函数
另一个Generator中如果有返回return<br>则会返回值给父Generator
1、yield* ["a", "b", "c"];<br>2、function* inner() {<br> yield 'hello!';<br> }<br><br> function* outer1() {<br> yield 'open';<br> yield* inner();<br> yield 'close';<br> }
Generator 函数的this
generator 函数也不能跟new命令一起用<br>generator 函数返回的不是this对象,而是<br>遍历器对象
完善版既能new也能next:<br>function* gen() {<br> this.a = 1;<br> yield this.b = 2;<br> yield this.c = 3;<br>}<br><br>function F() {<br> return gen.call(gen.prototype);<br>}<br><br>var f = new F();<br>f.next(); // Object {value: 2, done: false}<br>f.next(); // Object {value: 3, done: false}<br>f.next(); // Object {value: undefined, done: true}<br>f.a // 1<br>f.b // 2<br>f.c // 3<br>
概述
特征
1、function关键字与函数名之间有一个星号<br>2、函数体内部使用yield表达式
yield表达式
只有调用next方法才会遍历下一个内部状态<br>yield表达式就是暂停标志<br>
1、yield表达式只能用在 Generator 函数里面<br>2、yield表达式如果用在另一个表达式之中,<br> 必须放在圆括号里面<br>3、yield表达式用作函数参数或放在赋值表达式的右边,<br> 可以不加括号
与 Iterator 接口的关系
由于 Generator 函数就是遍历器生成函数,<br>因此可以把 Generator 赋值给对象的Symbol.iterator属性,<br>从而使得该对象具有 Iterator 接口。
next 方法
next方法可以带一个参数,<br>该参数就会被当作上一个yield表达式的返回值
总结:<br>实际上调用next方法,是计算yield后面表达式的值,<br>再调next,才执行上一个yield所在语句,因此参数<br>的值可以给到上一个语句使用
实现斐波那契数列
function* fibonacci() {<br> let [prev, curr] = [0, 1];<br> for (;;) {<br> yield curr;<br> [prev, curr] = [curr, prev + curr];<br> }<br>}<br><br>for (let n of fibonacci()) {<br> if (n > 1000) break;<br> console.log(n);<br>}
控制流程管理<br>实现多任务多步骤
// 实现多步骤<br>let steps = [step1Func, step2Func, step3Func];<br>function* iterateSteps(steps){<br> for (var i=0; i< steps.length; i++){<br> var step = steps[i];<br> yield step();<br> }<br>}
// 实现多任务多步骤<br>let jobs = [job1, job2, job3];<br>function* iterateJobs(jobs){<br> for (var i=0; i< jobs.length; i++){<br> var job = jobs[i];<br> yield* iterateSteps(job.steps);<br> }<br>}
// 循环所有任务和步骤<br>for (var step of iterateJobs(jobs)){<br> console.log(step.id);<br>}
0 条评论
下一页