引言
ES6真是一个颠覆性的东西,随便一个特性就要琢磨半天,今天先来啃一啃yield
正文
yield
到底是个啥呢,官方解释如下:
The yield keyword is used to pause and resume a generator function.
// yield这个关键字是用来暂停和恢复一个遍历器函数(的运行)的。
所以呢,yield
是个关键字,而且它只能用在遍历器函数里面,并且它有一个返回值{value: xxx,done: false}
,value
就是当前遍历器暂停时返回的结果,done
为false得时候,表示遍历器没遍历完,为true表示遍历已结束。
function *foo(){
var x = 1;
y = yield(x+1);
return;
}
var f = foo();
遍历器函数一个重要的特点就是需要next()
方法才能执行,所以上面f = foo()
什么都没发生,所以再加一句
f.next();
f.next()
是遍历器第一次执行,当遍历至关键字yield
时,函数暂停,并返回yield
后面的值,所以此时返回{value: 2,done: false}
再执行一次f.next()
,那么遍历器函数则从上次暂停的yield
处开始,直接到return语句,所以结果是{value: undefined,done: true}
next()
可以接收参数,就是可以将传入的参数作用于上一次yield
var f = function *(){
var x = 1;
var y = yield(x+1);
var z = yield(x+y);
return z;
}
var a = f.next(); // 2
var b = f.next(2); // 3
var c = f.next(4); // 4
第一次执行暂停于yield(x+1)
,并返回于x+1
等于2
第二次执行,next()
的参数2
,就代替了上面的yield(x+1)
,所以y=2
,那么暂停于第二个yieldyield(x+y)
并返回x+y
等于3
同理,第三次执行z=4
,return z
等于4
最后说一下遍历器函数里面的for..of
function *foo(){
yield 1;
yield 2;
yield 3;
return;
}
for(let v of foo()){
console.log(v);
}
// 1
// 2
// 3
for..of
循环在遍历的时候,就是把每碰到一个yield
,把yield
后面表达式的值赋给v
收工...
网友评论