<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [JS] generator基本使用

      next方法與yield關鍵字

      generator函數可以返回一個迭代器,通過next方法切換generator的狀態。

      generator函數被調用時并不會執行內部的語句,而是返回一個迭代器對象。

      迭代器對象首次調用next方法,才開始執行generator函數的語句。

      直到遇到yield語句,內部的執行中斷,返回yield關鍵字右側表達式的值作為迭代器調用next方法的返回值。

      yield語句本身沒有返回值,由下一次調用next方法時傳入參數作為yield的返回值。

      function* gen(){
        yield 'hello';
        let msg = yield 'world';
        console.log(msg);
        yield 'end';
      }
      
      const g = gen();
      
      console.log(g.next());
      console.log(g.next());
      console.log(g.next('passing msg'));
      console.log(g.next());
      

      輸出結果

      { value: 'hello', done: false }
      { value: 'world', done: false }
      passing msg
      { value: 'end', done: false }
      { value: undefined, done: true }
      

      throw方法

      迭代器對象可以通過調用throw方法向generator函數內部“拋出”異常,在函數內部通過try/catch捕獲。

      也可以在generator函數內部拋出異常,在調用迭代器方法的位置拋出異常。

      向內部拋出異常 - 分類討論

      1. (理想情況)調用iterator.throw(new Error(...))向內部拋出異常,在內部對應的yield表達式使用try/catch捕獲異常;
      2. 如果函數內部沒有捕獲異常,那么在iterator.throw()語句所在的位置拋出異常;
      3. 如果generator內部和iterator.throw所在位置都沒有捕獲異常進行處理,那么程序終止;
      4. 還沒首次執行next就執行throw,直接在外部調用iterator.throw的位置拋出異常。

      向外拋出異常

      接下來先看一個向外拋出異常的案例代碼:

      function* gen(){
        yield 1;
        throw new Error('inner error');
        yield 2;	// 不會被執行
        yield 3;	// 不會被執行
      }
      
      const g = gen();
      
      let res;
      do{
        try{
          res = g.next();
          console.log(res);
        }catch(e){
          console.log(e);	// 捕獲到 'inner error'
        }
      }while(!res.done);
      

      運行結果:

      { value: 1, done: false }
      Error: inner error
      { value: undefined, done: true }
      

      解析:在generator內部使用throw關鍵字拋出異常,外部調用iterator.next的地方捕獲異常,由于generator拋出異常,JS引擎會認為這個generator已經運行結束了,后續的yield不會執行,迭代器的done變為true;

      return關鍵字

      沒有寫return語句的 Generator 函數默認在尾部返回undefined。

      return關鍵字會返回右側表達式的值作為next方法的返回值。

      return會終止generator,后續的代碼都不會執行了,這個特點和普通函數保持一致。

      function* gen(){
        yield 1;
        return 2;
        yield 3;
      }
      
      const g = gen();
      
      let res;
      do{
        res = g.next();
        console.log(res.value);
      }while(!res.done);
      

      執行結果

      1
      2
      
      

      return 方法

      generator函數返回的迭代器對象還有return方法。

      可以在外部手動得到return方法得到的值,并且結束generator。

      function* gen(){
        yield 1;
        yield 2;
        yield 3;
      }
      
      const g = gen();
      
      console.log(g.next());
      console.log(g.return('done'));
      console.log(g.next());
      

      運行結果

      { value: 1, done: false }
      { value: 'done', done: true }
      { value: undefined, done: true }
      
      

      next、throw、return的共同點

      這三個方法的本質是讓generator函數恢復執行,并且使用不同的語句替換yield表達式。

      • next()yield表達式替換成一個值;
      • throw()yield表達式替換成一個throw語句;
      • return()yield表達式替換成一個return語句。
      posted @ 2024-07-13 17:34  feixianxing  閱讀(103)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲av午夜福利精品一区二区 | 亚洲一二三区精品美妇| 人妻精品动漫h无码| 日韩有码精品中文字幕| 亚洲av综合av一区| 香蕉EEWW99国产精选免费| 亚洲国产精品成人av网| 狠狠色噜噜狠狠亚洲AV| 永顺县| 国产精品国产三级国产an| 国产精品一码在线播放| 疯狂做受xxxx高潮欧美日本| 搡老熟女老女人一区二区| 亚洲一区二区三区小蜜桃| 亚洲国产成人av国产自| 亚洲精品动漫免费二区| 日韩精品中文字幕国产一| 午夜毛片不卡免费观看视频| 久久久无码精品午夜| 一本久道久久综合狠狠躁av| 日韩欧国产美一区二区在线| 亚洲一区二区经典在线播放| 办公室强奷漂亮少妇视频| 精品无码一区二区三区电影| 波多野结衣在线精品视频| 日韩精品人妻av一区二区三区| 国产免费播放一区二区三区| 亚洲AV成人无码精品电影在线| 南川市| 热99久久这里只有精品| 久久亚洲精品情侣| 国内极度色诱视频网站| 亚洲欧美偷国产日韩| 无码一区二区三区中文字幕| 男女扒开双腿猛进入爽爽免费看| 污污网站18禁在线永久免费观看 | 日本精品极品视频在线| 毛片大全真人在线| 国产成人高清亚洲综合| 蜜臀午夜一区二区在线播放| 公天天吃我奶躁我的在|