引言
ES6真是一個(gè)顛覆性的東西,隨便一個(gè)特性就要琢磨半天,今天先來(lái)啃一啃yield
正文
yield
到底是個(gè)啥呢,官方解釋如下:
The yield keyword is used to pause and resume a generator function.
// yield這個(gè)關(guān)鍵字是用來(lái)暫停和恢復(fù)一個(gè)遍歷器函數(shù)(的運(yùn)行)的机蔗。
所以呢,yield
是個(gè)關(guān)鍵字酸员,而且它只能用在遍歷器函數(shù)里面,并且它有一個(gè)返回值{value: xxx,done: false}
,value
就是當(dāng)前遍歷器暫停時(shí)返回的結(jié)果蜒车,done
為false得時(shí)候讳嘱,表示遍歷器沒遍歷完幔嗦,為true表示遍歷已結(jié)束。
function *foo(){
var x = 1;
y = yield(x+1);
return;
}
var f = foo();
遍歷器函數(shù)一個(gè)重要的特點(diǎn)就是需要next()
方法才能執(zhí)行沥潭,所以上面f = foo()
什么都沒發(fā)生邀泉,所以再加一句
f.next();
f.next()
是遍歷器第一次執(zhí)行,當(dāng)遍歷至關(guān)鍵字yield
時(shí)钝鸽,函數(shù)暫停汇恤,并返回yield
后面的值,所以此時(shí)返回{value: 2,done: false}
再執(zhí)行一次f.next()
,那么遍歷器函數(shù)則從上次暫停的yield
處開始拔恰,直接到return語(yǔ)句因谎,所以結(jié)果是{value: undefined,done: true}
next()
可以接收參數(shù),就是可以將傳入的參數(shù)作用于上一次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
第一次執(zhí)行暫停于yield(x+1)
,并返回于x+1
等于2
第二次執(zhí)行颜懊,next()
的參數(shù)2
,就代替了上面的yield(x+1)
财岔,所以y=2
,那么暫停于第二個(gè)yieldyield(x+y)
并返回x+y
等于3
同理,第三次執(zhí)行z=4
,return z
等于4
最后說(shuō)一下遍歷器函數(shù)里面的for..of
function *foo(){
yield 1;
yield 2;
yield 3;
return;
}
for(let v of foo()){
console.log(v);
}
// 1
// 2
// 3
for..of
循環(huán)在遍歷的時(shí)候河爹,就是把每碰到一個(gè)yield
,把yield
后面表達(dá)式的值賦給v
收工...