使用函数

时间:2015-05-29 20:11:34

标签: javascript ecmascript-6

所以我理解了生成器的概念以及关键字'产生的概念。代表在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 Documentation中的示例,我看到您可以使用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

任何人都可以帮助我理解为什么返回的值不是函数吗?我看了但是在生成器规范中有什么我错过了强制值是原始的吗?

1 个答案:

答案 0 :(得分:0)

让您的代码在Traceur中运行。随意重新粘贴和检查。记得转向实验&#39;位于右上角的选项中。

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"

只有后果:在记录之前用testerlet声明var

我猜这里,但它看起来像是一个错误的运输工具? 没有关键字的分配应该可以正常工作,我不相信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不是hoisted。所以它突然出现......似乎无声无息。看起来这只是一个转换器,因为let isn't actually supposed to hoist,只是声明它允许转换后的代码有一个提升变量。

具有更多ES6经验的人可以确认这是否是评论中的错误?也许转录程序期望某种语法,或者这是严格模式的要求?

摘要

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