精通ES6系列二(Generator函式)

2021-09-26 00:15:54 字數 3509 閱讀 2656

generator函式是es6提供的一種非同步程式設計解決方案,可以理解為一種狀態機,內部包含多個狀態。執行generator函式會返回乙個遍歷器(iterator),通過next方法去獲取狀態機裡面的值。形式上,generator函式是乙個普通函式,但是有兩個特徵,一是function後面有乙個*,二是函式體內部通過yield表示式,定義不同的內部狀態。

function* ******generator() 

const ****** = ******generator();

******.next(); //

******.next(); //

******.next(); //

******.next(); //

generator的呼叫和普通函式一樣,只是函式呼叫後並不會立即執行,而是返回乙個遍歷器。

由於 generator 函式返回的遍歷器物件,只有呼叫next方法才會遍歷下乙個內部狀態,所以其實提供了一種可以暫停執行的函式。yield表示式就是暫停標誌。generator 函式可以不用yield表示式,這時就變成了乙個單純的暫緩執行函式。yield表示式只能在generator函式中使用。

function* gen() 

const delay = gen();

settimeout(()=>,3000)

另外,yield表示式如果用在另乙個表示式之中,必須放在圓括號裡面。

function* demo()
next的引數可以理解為向generator函式中注入值,next方法可以帶乙個引數,該引數就會被當作上乙個yield表示式的返回值。

function* foo(x) 

var a = foo(5);

a.next() // object

a.next() // object

a.next() // object

var b = foo(5);

b.next() //

b.next(12) //

b.next(13) //

如果想要第一次呼叫next方法時,就能夠輸入值,可以在 generator 函式外面再包一層。

return function (...args) ;

} console.log(`first input: $`);

return 'done';

});// first input: hello!

//方法一

function* makeobjiterable(obj) ;

}}let obj1 =

for(let item of makeobjiterable(obj1))

方法二function* objectentries()

}let jane = ;

jane[symbol.iterator] = objectentries;

for (let [key, value] of jane) : $`);

}

next()throw()return()這三個方法本質上是同一件事,可以放在一起理解。它們的作用都是讓 generator 函式恢復執行,並且使用不同的語句替換yield表示式。

next()是將yield表示式替換成乙個值。

const g = function* (x, y) ;

const gen = g(1, 2);

gen.next(); // object

gen.next(1); // object

// 相當於將 let result = yield x + y

// 替換成 let result = 1;

上面**中,第二個next(1)方法就相當於將yield表示式替換成乙個值1。如果next方法沒有引數,就相當於替換成undefined

throw()是將yield表示式替換成乙個throw語句,第幾個就將那個yield替換成throw語句,導致程式執行失敗。

gen.throw(new error('出錯了')); // uncaught error: 出錯了

// 相當於將 let result = yield x + y

// 替換成 let result = throw(new error('出錯了'));

return()是將yield表示式替換成乙個return語句。

const g = function* (x, y) ;

let gen = g();

console.log(gen.next()); //

console.log(gen.return(1000)); // 相當於,將yield 2 替換為return 1000,所以執行結束。

console.log(gen.next()); //

es6 提供了yield*表示式,作為解決辦法,用來在乙個 generator 函式裡面執行另乙個 generator 函式。

function* mygeneratorinner() 

function* mygeneratorinner()

function* mygenerator()

for(let item of mygenerator()) //1,2,3,4,5,6

//yield命令後面如果不加星號,返回的是整個陣列,加了星號就表示返回的是陣列的遍歷器物件。

function* gen()

gen().next() //

//實際上,任何資料結構只要有 iterator 介面,就可以被yield*遍歷。

let read = (function* () )();

read.next().value // "hello"

read.next().value // "h"

7.generator作為物件的屬性的寫法

//如果乙個物件的屬性是 generator 函式,可以簡寫成下面的形式。

let obj =

};//上面**中,mygeneratormethod屬性前面有乙個星號,表示這個屬性是乙個 generator 函式。

//它的完整形式如下,與上面的寫法是等價的。

let obj =

};

ES6系列 ES6簡介

2015年6月17日,ecmascript的第六個版本正式發布,該版本正式名稱為ecmascript 2015,但通常被稱為ecmascript 6或者es6。瀏覽器對es6的支援情況 es6主要應用於node.js,如果想用在瀏覽器中,就需要使用轉碼器 將es6 轉成es5 這意味著,可以用es6...

ES6系列二 函式

一 箭頭函式,就是函式的簡寫。如果只有乙個引數,可以省 如果只有乙個return,可以省 普通函式 function name 箭頭函式,去掉 function,加上 let show1 function let show2 show1 show2 let show4 function a let ...

ES6系列(二)解構賦值

之前在我們開發的過程中,難免會碰到這樣的問題 後端傳給我們一串資料,然後我們需要對這個資料進行處理。如果是這樣的乙個資料 let obj 然後我們需要用變數去儲存這些資料,那麼我們可能會這麼操作 let username obj.username,userid obj.userid,professi...