zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    cad 创建自定义菜单
    标准C++的类型转换符
    Assert usages
    c++排序算法与模板和STL_zhuan
    C++ 中int,char,string,CString类型转换
    C++ 之 C style string
    数据库优化细节——转
    C++容器——zhuan
    公共类库_address:http://www.cnblogs.com/wuhuacong/archive/2012/03/26/2418786.html
    C++学习篇——C++ STL中迭代器介绍(收集)
  • 原文地址:https://www.cnblogs.com/intelwisd/p/7906806.html
Copyright © 2011-2022 走看看