ecma6 yield
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | function * generator(k){ console.log( 'begin' ); var x = yield k; console.log( 'x:' ,x); var y = yield x+k; console.log( 'y:' ,y); return x+y+k; } var o = generator(1); var r = o.next(); console.log( '1:' +r.value, 'done:' +r.done); r = o.next(3); console.log( '2:' +r.value, 'done:' +r.done); r = o.next(5); console.log( '3:' +r.value, 'done:' +r.done); //log begin 1:1 done: false x: 3 2:4 done: false y: 5 3:9 done: true =========================================================================== function * generator(k){ console.log( 'begin' ); var x = yield k; console.log( 'x:' ,x); return 'end' ; var y = yield x+k; console.log( 'y:' ,y); return x+y+k; } var o = generator(1); var r = o.next(); console.log( '1:' +r.value, 'done:' +r.done); r = o.next(3); console.log( '2:' +r.value, 'done:' +r.done); r = o.next(5); console.log( '3:' +r.value, 'done:' +r.done); //log begin 1:1 done: false x: 3 2:end done: true 3:undefined done: true |
迭代构造器可以接受初值,在构造时传入而非首次调用 next 时,
yield 后面的值被返回,后继代码暂时中断,直到调用 next 方法,
yield 赋值表达式:在下一次调用 next 时将传入的值赋給变量,
如果遇到 return 则迭代执行结束
迭代构造器继承自 Function , 因此 function 具备的用于修改执行体内的 this 指向 的 call、apply、bind 方法,迭代构造器也都具备,用法与 function 一样, 另外, 迭代构造器不允许访问 caller 属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function fun(){ var g = function *(k){ console.log(arguments[0],arguments.length,arguments.callee) console.log( this ); var x = yield 123; return x; } var o = g.call(({a:123,b:456}),888) o.next() o.next(999) } fun() //log 888 1 function g(k) Object {a: 123, b: 456} |
使用 yield* 表达式 执行可迭代对象:如果过yield* 后面的表达式是一个可迭代对象,则 yield* 操作会执行迭代操作而返回这个可迭代对象迭代完毕的结果。
function* g1() { yield 2; yield 3; yield 4; } function* g2() { yield 1; yield* g1(); yield 5; } var iterator = g2(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: 4, done: false } console.log(iterator.next()); // { value: 5, done: false } console.log(iterator.next()); // { value: undefined, done: true }
分类:
javascript
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库