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 }
复制代码

 

posted @   ecalf  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示