欧美激情中文字幕在线_国产区精品视频_免费久久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日
前臺投稿現在有點太抽象了 希望可以弄成那種分區填寫的 標題,內容,圖片,目錄,標簽,這樣的
評論于留言建議
主站蜘蛛池模板: 视频一区三区| 亚洲v日韩v欧美v综合| 久久久久久欧美| 精品日韩在线播放| 国产精品第一页在线| 日韩精品欧美在线| 精品久久久久久久免费人妻| 国产精品久久久久久av下载红粉| 国产精品免费视频久久久| 国产精品av在线| 欧美激情第6页V| 91精品国产高清久久久久久| 久久久天堂国产精品女人| 114国产精品久久免费观看| 久久久天堂国产精品| 国产精品久久久一区| 久久伊人精品天天| 亚洲狠狠婷婷综合久久久| 国产精品视频最多的网站| 久久视频在线观看中文字幕| 97精品免费视频| 国产欧美日韩精品专区| 免费在线观看一区二区| 91精品国产一区| 丁香六月激情婷婷| 日韩一二区视频| 一区二区免费在线视频| 91久久久国产精品| 国产免费一区视频观看免费| 久久精品国产欧美激情| 久久国产视频网站| 国产精品自产拍在线观看| 久久精品视频在线| 国产一区二区在线免费| 国产精品美女999| 国产精品久久久久久久久久久不卡| 国产日本欧美在线观看| 国产成a人亚洲精v品在线观看| 久久韩国免费视频| 国产精品久久久久国产a级| 国产在线不卡精品|