deep-in-es6(二)
阿新 • • 發佈:2017-11-28
一次 ner fun ext object 不同的 for color 字符
es6-生成器Generators:
eg:
function* quips(name) { yield "您好"+name+"!"; if(name.startsWith("a")) { yield "你的名字很酷"+name+"首字符是a,這很酷!"; } yield "下次見哦!"; }
上述函數就是生成器函數,與普通函數的區別:
在生成器函數中yield的功能大致與return相似,但用法有區別,return在普通函數中只能用一次,而yield在生成器函數中能使用多次。
生成器函數的執行:
當你調用一個生成器時,它並非立即執行,而是返回一個已暫停的生成器對象。你可將這個生成器對象視為一次函數調用,只不過立即凍結了,它恰好在生成器函數的最頂端的第一行代碼之前凍結了。
每當你調用生成器對象的.next()方法時,函數調用將其自身解凍並一直運行到下一個yield表達式,再次暫停。
調用最後一個.next()時,我們最終抵達生成器函數的末尾,所以返回結果中done的值為true。抵達函數的末尾意味著沒有返回值,所以返回結果中value的值為undefined。
function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜歡這篇介紹ES6的譯文"; if (name.startsWith("X")) { yield "你的名字 " + name + " 首字母是X,這很酷!"; } yield "我們下次再見!"; } var iter = quips("jorendorff"); //[object Generator] iter.next();//{ value: "你好 jorendorff!", done: false } iter.next(); //{ value: "希望你能喜歡這篇介紹ES6的譯文", done: false } iter.next(); //{ value: "我們下次再見!", done: false } iter.next(); //{ value: undefined, done: true }
當你調用一個生成器時,它並非立即執行,而是返回一個已暫停的生成器對象(上述實例代碼中的iter)。你可將這個生成器對象視為一次函數調用,只不過立即凍結了,它恰好在生成器函數的最頂端的第一行代碼之前凍結了。
每當你調用生成器對象的.next()方法時,函數調用將其自身解凍並一直運行到下一個yield表達式,再次暫停。
這也是在上述代碼中我們每次都調用iter.next()的原因,我們獲得了quips()函數體中yield表達式生成的不同的字符串值。
調用最後一個iter.next()時,我們最終抵達生成器函數的末尾,所以返回結果中done的值為true。抵達函數的末尾意味著沒有返回值,所以返回結果中value的值為undefined。
for (var value of range(0, 3)) { alert("Ding! at floor #" + value); } class RangeIterator { constructor(start, stop) { this.value = start; this.stop = stop; } [Symbol.iterator]() { return this; } next() { var value = this.value; if (value < this.stop) { this.value++; return {done: false, value: value}; } else { return {done: true, value: undefined}; } } } function range(start, stop) { return new RangeIterator(start, stop); }
deep-in-es6(二)