[英]ES6 yield (yield 1)(yield 2)(yield 3)()
function* generatorFunction() {
yield (yield 1)(yield 2)(yield 3)();
}
var iterator = generatorFunction();
// [1, 2, 3]
var iteratedOver = [iterator.next().value, iterator.next().value, iterator.next().value];
我不确定这是怎么回事。
yield
不返回函数引用,那么像(yield 2)
那样的括号语句是什么 - 它们是没有实体的胖箭头匿名函数吗? 他们如何使用这样的部分应用程序?
我在这里遗漏了一些东西,有人可以解释一下吗?
更新:在三个浏览器上试用,Chrome 50.0.2661.86,Safari 9.1(50.0.2661.86),Firefox 44.0.2,都可以正常运行。
评论者报告Babel也没有错误地执行。
问题的来源是http://tddbin.com/#?kata=es6/language/generator/send-function ,第二个kata。
我不确定这是怎么回事。
呃,是的,它应该不起作用 。 这只是因为Babel中的一个错误而起作用。
yield
不返回函数引用,那么像(yield 2)
那样的括号语句是什么 - 它们是没有实体的胖箭头匿名函数吗? 他们如何使用这样的部分应用程序?
不,它只是标准的功能应用,没有魔力。 yield
可以返回一个函数引用,当它发生时,这可能会起作用。 如果没有,它将在第三个.next()
调用上抛出异常。
作为工作版本的示例:
function* generatorFunction() {
yield (yield 1)(yield 2)(yield 3)();
}
var test = (a) => {
console.log(a);
return (b) => {
console.log(b);
return (c) => {
console.log(c);
return 4;
};
};
};
var iterator = generatorFunction();
iterator.next(); // {value: 1, done: false}
iterator.next(test); // {value: 2, done: false}
iterator.next("a"); // "a" {value: 3, done: false}
iterator.next("b"); // "b" undefined {value: 4, done: false}
iterator.next("d"); // {value: undefined, done: true}
那么这是如何工作的呢? 那些嵌套/链接的yield
语句最好写成
function* generatorFunction() {
let fn1 = yield 1;
let a = yield 2;
let fn2 = fn1(a);
let b = yield 3;
let fn3 = fn2(b);
let res = fn3();
let d = yield res;
return undefined;
}
评论者报告Babel也没有错误地执行。
那是因为一个巴贝尔虫。 如果检查转换器输出 ,它实际上就像
function* generatorFunction() {
let fn1 = yield 1;
let a = yield 2;
let b = yield 3;
// these are no more executed with only 3 `next` calls
let fn2 = fn1(a);
let fn3 = fn2(b);
let res = fn3();
let d = yield res;
return undefined;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.