gpt4 book ai didi

javascript - ES6 yield (yield 1)(yield 2)(yield 3)()

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:01 29 4
gpt4 key购买 nike

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,均正常运行。

ESFiddle也可以毫无错误地执行它。

评论者报告 Babel 执行也没有错误。

问题出处来自http://tddbin.com/#?kata=es6/language/generator/send-function , 第二个型。

最佳答案

I'm not sure how this works.

呃,是的,它应该行不通。由于 Babel 中的错误,它才起作用。

yield doesn't return a function reference, so what are the parenthetical statements like (yield 2) doing - are they fat arrow anonymous functions without bodies? How are they called using partial application like that?

不,它真的只是标准功能应用程序,没有魔法。 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;
}

Commenters report Babel executes without errors as well.

那是因为一个 babel 错误。如果您检查 transpiler output , 它实际上表现得像

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;
}

关于javascript - ES6 yield (yield 1)(yield 2)(yield 3)(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958171/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com