ES6学习笔记---yield到底是个啥

引言

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=4return 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

收工...

你可能感兴趣的:(ES6学习笔记---yield到底是个啥)