• 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);
        }
  • 相关阅读:
    PDO::prepare
    PDO::lastInsertId
    PDO::inTransaction
    PDO::getAvailableDrivers
    odu恢复drop表--通过logmnr挖掘object_id
    rpmbuild 构建rpm包时报错解决 error: Installed (but unpackaged) file(s) found:
    mysql high availability 概述
    mysql学习------权限机制
    mysql学习------二进制日志
    pt-query-digest查询日志分析工具
  • 原文地址:https://www.cnblogs.com/intelwisd/p/7906806.html
Copyright © 2020-2023  润新知