generator函數

語法規則:

  • 以function* funname形式申明函數
  • 函數體內使用yield關鍵字中斷程序向下執行,被yield修飾的表達式的值會被記錄下來
  • 執行funname函數會返回一個可遍歷的對象
  • 調用對象的next()方法,纔會驅動這個函數執行,而且返回yield修飾的表達式的值
  • next()方法返回值是一個對象{value: '', done: false},當done爲true即表示函數執行完畢了。

1.generator函數我把它理解爲可中止的函數

function* stopFun(){
	let x = 1;
	console.log(1)
	yield x = x+1;
	console.log(2);
}

------------------------------------
let it = stopFun();
console.log(it.next());

控制檯打印以下:
1
{value:2,done:false}
------------------------------------
------------------------------------
let it = stopFun();
console.log(it.next());
console.log(it.next());

控制檯打印以下:
1
{value:2,done:false}
2
{value: undefined, done: true}
------------------------------------

總結:java

  • 當執行next方法即在函數中尋找yield,若是找到yield則將yield的值返回,且原函數執行中止
  • 再次調用next會繼續執行yield以後的程序,若沒找到yield,則函數直接執行完畢,返回done:true
  • 若是函數有return,則value返回return的值,沒有則返回undefined

老驢拉新磨,磨轉豆產粉...函數

2.next()方法帶參使用

若是把yield比做存檔,next()就是讀取存檔,繼續遊戲,最關鍵的在於,在繼續遊戲前,他能修改存檔的數據
function* changeFun(a){
	console.log(a);
	let b = yield (a+1);
	console.log(b);
	let c = b*2;
	console.log(c);
}
------------------------------------
let it = changeFun(1);
console.log(it.next());
console.log(it.next());

控制檯打印以下:
1
{value: 2, done: false}
undefined
NaN
{value: undefined, done: true}
------------------------------------
------------------------------------
let it = changeFun(1);
console.log(it.next());
console.log(it.next(2));

控制檯打印以下:
1
{value: 2, done: false}
2
4
{value: undefined, done: true}
------------------------------------

總結code

  • 第一次調用next()開始執行程序,當遇到yield,中止運行,返回表達式(a+1)的值,
  • 第二次調用next(),從上一個yield中止的位置繼續執行,若沒有傳參,表示yield(a+1)沒有值,b打印出來的是undefined
  • 若是傳參2,則b = yield(a+1)就有值了。說明next傳參,參數的值是整個yield表達式的值。

3.generator函數能夠強制中斷結束程序。

若是這一局遊戲不想玩了,玩家是能夠直接return的,強制退出,注意:是強制退出,後面的都不用走了!對象

function* returnTest(){
	console.log(1);
	yield x = "遊戲存檔";
	console.log(2);
	return "game over!"
}
------------------------------------
let it = returnTest();
console.log(it.next());
console.log(it.return());
console.log(it.next());

控制檯打印以下:
1
{value: "遊戲存檔", done: false}
{value: undefined, done: true}
{value: undefined, done: true}
------------------------------------

4.for of循環語句能夠遍歷generator函數的調用對象

function* recycleFun(){
	yield a = "1";
	yield "2";
	yield "3";
	yield "over";
}

------------------------------------
let it = recycleFun();
for(let value of it){
  console.log(value)
}

控制檯打印以下:
1
2
3
over
------------------------------------


實戰篇

相關文章
相關標籤/搜索