Javascript 用函数理解ES6中的产量

Javascript 用函数理解ES6中的产量,javascript,ecmascript-6,Javascript,Ecmascript 6,因此,我理解生成器的概念以及JavaScript中的关键字“yield”代表了什么,但当我在Chrome(Mac OS X 10.10.3上的43.0.2357.81(64位)版本)中使用它时,我遇到了一种我不理解结果的情况 下面是一个关于收益率如何工作的工作示例: 函数*test(){ var i=0; 而(i

因此,我理解生成器的概念以及JavaScript中的关键字“yield”代表了什么,但当我在Chrome(Mac OS X 10.10.3上的43.0.2357.81(64位)版本)中使用它时,我遇到了一种我不理解结果的情况

下面是一个关于收益率如何工作的工作示例:

函数*test(){
var i=0;
而(i<4){
收益率++指数;
}
}
测试仪=测试();
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)//未定义
结果如我所料。按照中的示例,我发现您可以使用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
函数*test(){
var i=0;
而(i<4){
++一,;
屈服函数(a){返回a+i;};
}
}
测试仪=测试();
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)//未定义
有人能帮我理解为什么返回的值不是函数吗?我看了一下,但是在生成器规范中是否有我遗漏的东西,强制将值设置为原语?

让您的代码工作。请随意重新粘贴和检查。记住在右上角的选项中打开“实验”

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"
.initGeneratorFunction()
正在接受输入,但是
test
在这样分配时不接受输入。所以它…似乎在默默地扔。看起来这只是一个传输程序,因为
let
,只是声明它允许传输的代码有一个提升的变量

有更多ES6经验的人能确认这是评论中的错误吗?可能传输程序需要某种语法,或者这是严格模式的要求

摘要


看起来您的理解很好,只是当前transpiler环境的一个怪癖。声明变量可能是一种很好的做法,TeamAwesome(即)说
const
是一个很好的选择

我不能复制这个。我看到
函数匿名(a)
四次。你用的是什么版本的Chrome?这里也一样。在Chrome 43上为我工作时,我假设您看到的
undefined
是对
console.log
语句求值时返回的值。该函数是从生成器返回的:在第二个示例中,我还调用了函数do
tester.next().value(1)
(这里也有chrome 43)。我在Mac OS上使用的是chrome 43.0.2357.81版(64位)X@Dario我还尝试记录从next()返回的整个对象调用时,返回的对象完全缺少值键/值。
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"
$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