欧美激情中文字幕在线_国产区精品视频_免费久久99精品国产自_日韩精品 欧美

JavaScript中函數后面打星號方式聲明

function*?這種聲明方式(function關鍵字后跟一個星號)會定義一個生成器函數?(generator function),它返回一個 ?Generator??對象。

function* generator(i) {
  yield i;
  yield i + 10;
}

const gen = generator(10);

console.log(gen.next().value);
// expected output: 10

console.log(gen.next().value);
// expected output: 20

語法

function* name([param[, param[, ... param]]]) { statements }
name
函數名
param
要傳遞給函數的一個參數的名稱,一個函數最多可以有255個參數。
statements
普通JS語句。

描述

生成器函數在執行時能暫停,后面又能從暫停處繼續執行。

調用一個生成器函數并不會馬上執行它里面的語句,而是返回一個這個生成器的?迭代器?(?iterator?)對象。當這個迭代器的?next()?方法被首次(后續)調用時,其內的語句會執行到第一個(后續)出現yield的位置為止,yield?后緊跟迭代器要返回的值。或者如果用的是?yield*(多了個星號),則表示將執行權移交給另一個生成器函數(當前生成器暫停執行)。

next()方法返回一個對象,這個對象包含兩個屬性:value 和 done,value 屬性表示本次?yield?表達式的返回值,done 屬性為布爾類型,表示生成器后續是否還有?yield?語句,即生成器函數是否已經執行完畢并返回。

調用?next()方法時,如果傳入了參數,那么這個參數會傳給上一條執行的 yield語句左邊的變量,例如下面例子中的?x?

function *gen(){
    yield 10;
    x=yield 'foo';
    yield x;
}

var gen_obj=gen();
console.log(gen_obj.next());// 執行 yield 10,返回 10
console.log(gen_obj.next());// 執行 yield 'foo',返回 'foo'
console.log(gen_obj.next(100));// 將 100 賦給上一條 yield 'foo' 的左值,即執行 x=100,返回 100
console.log(gen_obj.next());// 執行完畢,value 為 undefined,done 為 true

當在生成器函數中顯式?return?時,會導致生成器立即變為完成狀態,即調用?next()?方法返回的對象的?done?為?true。如果?return?后面跟了一個值,那么這個值會作為當前調用?next()?方法返回的 value 值。

 

示例

簡單示例

function* idMaker(){
  var index = 0;
  while(index<3)
    yield index++;
}

var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined

生成器也可以接收參數:

 

function* idMaker(){
    var index = arguments[0] || 0;
    while(true)
        yield index++;
}

var gen = idMaker(5);
console.log(gen.next().value); // 5
console.log(gen.next().value); // 6

yield*的示例

function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}

function* generator(i){
  yield i;
  yield* anotherGenerator(i);// 移交執行權
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

?傳遞參數

function *createIterator() {
    let first = yield 1;
    let second = yield first + 2; // 4 + 2 
                                  // first =4 是next(4)將參數賦給上一條的
    yield second + 3;             // 5 + 3
}

let iterator = createIterator();

console.log(iterator.next());    // "{ value: 1, done: false }"
console.log(iterator.next(4));   // "{ value: 6, done: false }"
console.log(iterator.next(5));   // "{ value: 8, done: false }"
console.log(iterator.next());    // "{ value: undefined, done: true }"

顯式返回

function* yieldAndReturn() {
  yield "Y";
  return "R";//顯式返回處,可以觀察到 done 也立即變為了 true
  yield "unreachable";// 不會被執行了
}

var gen = yieldAndReturn()
console.log(gen.next()); // { value: "Y", done: false }
console.log(gen.next()); // { value: "R", done: true }
console.log(gen.next()); // { value: undefined, done: true }

生成器函數不能當構造器使用

function* f() {}
var obj = new f; // throws "TypeError: f is not a constructor"

?使用迭代器遍歷二維數組并轉換成一維數組:

function* iterArr(arr) {            //迭代器返回一個迭代器對象
  if (Array.isArray(arr)) {         // 內節點
      for(let i=0; i < arr.length; i++) {
          yield* iterArr(arr[i]);   // (*)遞歸
      }
  } else {                          // 離開     
      yield arr;
  }
}
// 使用 for-of 遍歷:
var arr = ['a', ['b', 'c'], ['d', 'e']];
for(var x of iterArr(arr)) {
        console.log(x);               // a  b  c  d  e
 }

// 或者直接將迭代器展開:
var arr = [ 'a', ['b',[ 'c', ['d', 'e']]]];
var gen = iterArr(arr);
arr = [...gen];                        // ["a", "b", "c", "d", "e"]

?兼容性

 

 

 

 


 

上一篇 ES6中的異步詳解
下一篇 利用Fiddler調試微信網頁js
目錄
applek

applek管理員

個人說明在個人中心里面設置

本月創作熱力圖

最新評論
小超
小超
7月9日
下個版本考慮將下載地址加密(防止采集)
Lvtu
Lvtu
7月4日
qiang厲害
評論于留言建議
chinacnd
chinacnd
6月26日
這個主題是怎么做到加載速度那么快的?
風起云涌
風起云涌
6月17日
前臺投稿現在有點太抽象了 希望可以弄成那種分區填寫的 標題,內容,圖片,目錄,標簽,這樣的
評論于留言建議
主站蜘蛛池模板: 中文精品视频一区二区在线观看 | 蜜桃视频成人在线观看| 欧美精品999| 精品午夜一区二区| 日本不卡一区二区三区视频| 尤物国产精品| 久久亚洲精品视频| 欧美韩国日本精品一区二区三区| 亚洲精品乱码视频| 国产欧美精品在线| 国产一区二区视频在线观看 | 国产精品视频内| 久久国产精品视频| 日本不卡视频在线播放| 无码日韩人妻精品久久蜜桃V| 国产二区视频在线| 国产精品美女午夜av| 国产精品久久久久久久av大片| 久久99热精品这里久久精品| 久久精品视频一| 久久精品国产成人精品| 欧美日韩亚洲一| 免费在线观看日韩视频| 欧美韩国日本精品一区二区三区 | 亚洲国产精品久久久久婷婷老年| 国产高潮呻吟久久久| 国产精品免费久久久久久| 国产精品美女呻吟| 国产精品美女久久久免费| 97精品免费视频| 亚洲精品日韩在线观看| 日韩av一级大片| 久久视频在线免费观看| 国产日韩在线观看av| 国产成人在线精品| 大波视频国产精品久久| 日韩在线中文视频| 青青精品视频播放| 久久精品国产精品亚洲色婷婷| 久久久99国产精品免费| 国产九九九九九|