Generator是ES6里面的新增規范,ES6其實就是ES2015。ES5、ES6、ES7這些術語大家上網一查就都明白了。JavaScript是一個范程,就是我們說的JS。ES就是ECMA Script,是JavaScript標準的書面說法。ES4、5、6、7其實是JS這門語言發展中的不同的版本。在不同的版本中賦予了這門語言不同的能力。
生成器的函數會返回一個生成器的對象
yield n返回n。調用的時候按照我們的理解genObj是會立馬執行的。傳入的值是2,循環了3次以后,這個n的值就變成了5。有了yield關鍵字以后,這里的結果就并不一樣了。調用gen函數的時候,拿到的這個genObj,它其實是一個迭代器對象,并不會去執行的,需要每次調用這個迭代器的next()方法,才會從上一次暫停的地方開始執行,直到遇到下一個yield語句。所以這里yield語句的作用就是暫停執行后面的代碼。當再次調用next()方法,才會繼續往下執行。所以我們可以猜出這里的執行結果。第一次執行next()的時候,傳進去的值是2,然后n執行+1,然后遇到yield關鍵字會暫停,然后這個時候返回n的這個值,也就是3。然后再執行next(),這個時候之前保存的堆棧中n的值是3,所以這里是執行+1,然后返回的值就是4。那再調用next(),就是5。然后這個時候這個循環體也就執行完了。再調用next()的時候會拿到一個undefined值。
迭代器執行next()的時候總是返回一個對象。然后在這個對象里面總會有兩個屬性。