• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
可爱熊
熊爱可
博客园    首页    新随笔    联系   管理    订阅  订阅

Generator 函数的语法

1.  Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。

  执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。

  形式上,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)

  function* helloWorldGenerator() {
    yield 'hello';
    yield 'world';
    return 'ending';
  }

  var hw = helloWorldGenerator();

  必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止。换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行。

2.  yield表达式

  由于 Generator 函数返回的遍历器对象,只有调用next方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。yield表达式就是暂停标志。

   (1)遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。

   (2)下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式。

   (3)如果没有再遇到新的yield表达式,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。

   (4)如果该函数没有return语句,则返回的对象的value属性值为undefined。

 yield表达式只能用在 Generator 函数里面,用在其他地方都会报错。

 yield表达式如果用在另一个表达式之中,必须放在圆括号里面。

  function* demo() {
    console.log('Hello' + yield); // SyntaxError
    console.log('Hello' + yield 123); // SyntaxError

    console.log('Hello' + (yield)); // OK
    console.log('Hello' + (yield 123)); // OK
  }

  yield表达式用作函数参数或放在赋值表达式的右边,可以不加括号。

  function* demo() {
    foo(yield 'a', yield 'b'); // OK
    let input = yield; // OK
  }

3. Generator.prototype.return()

  Generator 函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数。

  function* gen() {
    yield 1;
    yield 2;
    yield 3;
  }

  var g = gen();

  g.next();  // {value: 1, done: false}

  g.return('xhk'); // {value: 'xhk', done: true}

  g.next();  // {value: undefined, done: true}

4. yield* 用于在一个generator函数里面调用另一个generator函数

是不是你的耳朵是圆的,我的话是方的,所以你听不进去呀。
posted @ 2018-01-31 15:46  熊小可  阅读(144)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3