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...