javascript - Understanding Yield in ES6 with functions -
so understand concept of generators , keyword 'yield' represents in javascript i've played around in chrome (version 43.0.2357.81 (64-bit) on mac os x 10.10.3) i've ran situation don't understand result of.
here working example of how yield works:
function* test() { var = 0; while ( < 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
the result expect. following example in mdn documentation see can use yield* use generator function. in understanding expect using yield function should return function it's value. here example:
function* test() { var = 0; while ( < 4 ) { ++i; yield function( ) { return + 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
can me understand why value returned not function? looked there missed in generator spec forces value primitive?
got code work in traceur. feel free re-paste , check. remember turn 'experimental' on in options located top-right.
function* test() { var = 0; while ( < 4 ) { ++i; yield function( ) { return + 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"
only diff of consequence: declaring tester
let
or var
before logging.
i guessing here, looks bug in transplier? assigning without keyword should work fine, don't believe ecma6 introduces limitations here. break much.
here transpiled code:
$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: = 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 + 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()
accepting input, test
isn't hoisted when assigned that. throws...silently seems. looks transpiler thing, since let
isn't supposed hoist, declaring allows transpiled code have hoisted variable.
can more es6 experience confirm if bug in comments? maybe transpilers expect syntax, or requirement of strict mode?
summary:
looks understanding fine, quirk of current transpiler environment. it's practice declare variables, team awesome (i.e. airbnb) says const
choice!
Comments
Post a Comment