繁体   English   中英

通过功能了解ES6的收益

[英]Understanding Yield in ES6 with functions

因此,我了解了生成器的概念以及关键字“ yield”在JavaScript中的含义,但是正如我在Chrome浏览器(Mac OS X 10.10.3中的版本43.0.2357.81(64位))中所使用的那样,陷入我不了解结果的境地。

这是一个关于产量如何工作的有效示例:

function* test() {
    var i = 0;
    while ( i < 4 ) {
        yield ++index;
    }
}

tester = test();
console.log( tester.next().value ); //1
console.log( tester.next().value ); //2
console.log( tester.next().value ); //3
console.log( tester.next().value ); //4
console.log( tester.next().value ); //undefined

结果符合我的预期。 按照MDN文档中的示例,我看到您可以使用yield *来使用另一个生成器函数。 以我的理解,我希望将yield与函数一起使用应返回该函数的值。 这是我的示例:

function* test() {
    var i = 0;
    while ( i < 4 ) {
        ++i;
        yield function( a ) { return a + i; };
    }
}

tester = test();
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined

谁能帮助我理解为什么返回的值不是函数? 我看了一下,但是在生成器规范中是否遗漏了一些将值强制为原始值的东西?

获得了在Traceur中工作的代码。 随时重新粘贴并检查。 请记住在右上角的选项中打开“实验性”。

function* test() {
    var i = 0;
    while ( i < 4 ) {
        ++i;
        yield function( a ) { return a + i; };
    }
    return "done"
}

let tester = test();
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //string literal "done"

唯一的区别是:在记录之前用letvar声明tester

我在这里猜测,但看起来像是转换器中的错误? 不使用关键字进行分配应该可以正常工作,我不认为ECMA6在这里引入了任何限制。 它会破裂太多。

这是转码后的代码:

$traceurRuntime.ModuleStore.getAnonymousModule(function() {
  "use strict";
  var $__0 = $traceurRuntime.initGeneratorFunction(test);
  function test() {
    var i;
    return $traceurRuntime.createGeneratorInstance(function($ctx) {
      while (true)
        switch ($ctx.state) {
          case 0:
            i = 0;
            $ctx.state = 11;
            break;
          case 11:
            $ctx.state = (i < 4) ? 5 : 7;
            break;
          case 5:
            ++i;
            $ctx.state = 6;
            break;
          case 6:
            $ctx.state = 2;
            return function(a) {
              return a + i;
            };
          case 2:
            $ctx.maybeThrow();
            $ctx.state = 11;
            break;
          case 7:
            $ctx.returnValue = "done";
            $ctx.state = -2;
            break;
          default:
            return $ctx.end();
        }
    }, $__0, this);
  }
  tester = test();
  console.log(tester.next().value);
  console.log(tester.next().value);
  console.log(tester.next().value);
  console.log(tester.next().value);
  console.log(tester.next().value);
  return {};
});
//# sourceURL=traceured.js  

.initGeneratorFunction()正在接受输入,但是当这样分配时,不会提升 test 所以它抛出了……似乎是无声的。 看起来这只是一个编译器问题,因为let 实际上不应该被提升 ,只是声明它允许已编译的代码具有提升的变量。

有更多ES6经验的人可以确认这是否是注释中的错误吗? 编译器可能期望某种语法,还是这是严格模式的要求?

总结

看起来您的理解很好,只是对当前Transpiler环境的一个怪癖。 声明变量可能是个好习惯,Team Awesome(即AirBnB )说const是个不错的选择!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM