1. 程式人生 > >deep-in-es6(二)

deep-in-es6(二)

一次 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(二)