ES6学习笔记-生成器-Generators

Author Avatar
Splendour 11月 18, 2015

生成器函数与普通函数的区别如下:

  • 使用 function* 声明
  • 有一种类似 return 的语法:关键字 yield。不同的是普通函数只可以 return 一次,而生成器函数可以 yield 多次;在执行过程中,yield 表达式可以暂停,后续可随时恢复执行状态,而普通函数不能子暂停。
    function* quips(name) {
    yield "你好 " + name + "!";
    yield "希望你能喜欢这篇介绍ES6的译文";
    if (name.startsWith("X")) {
      yield "你的名字 " + name + "  首字母是X,这很酷!";
    }
    yield "我们下次再见!";
    }
    
    该函数的调用过程如下:
    > var iter = quips("jorendorff");
    [object Generator]
    > iter.next()
    { value: "你好 jorendorff!", done: false }
    > iter.next()
    { value: "希望你能喜欢这篇介绍ES6的译文", done: false }
    > iter.next()
    { value: "我们下次再见!", done: false }
    > iter.next()
    { value: undefined, done: true }
    
    从以上过程可以看出:
  • 生成器函数每次调用 .next() 方法时,都会返回一个已暂停的生成器对象,类似于一次函数调用,只不过暂停了。
  • 当遇到 yield 函数暂停时,会产生 value,类似于普通函数的 return,另外还有一个 done 值,用来标志生成器函数是否到达了末尾
  • 生成器函数永不并发,它拥有确定的执行顺序