deep-in-es6(二)

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);
    }
原文地址:https://www.cnblogs.com/intelwisd/p/7906806.html