我可以在生成器中使用 ES6 的箭头函数语法吗?(箭头符号)

IT技术 javascript ecmascript-6 syntax generator arrow-functions
2021-02-11 15:15:32

也就是说,我如何表达

function *(next) {}

使用箭头语法?我已经尝试了所有我能想到的组合,但我找不到任何关于它的文档。

(我目前使用的是 Node.js v0.11.14。)

6个回答

我可以在生成器中使用 ES6 的箭头函数语法吗?

你不能。对不起。

根据MDN

function*声明(function关键字后跟一个星号)定义的发电机的功能。

规范文件(我的重点):

函数的语法扩展到添加一个可选的*令牌:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"
@Bergi 箭头函数背后的推理比这复杂得多。这不是关于简洁。箭头函数不需要是轻量级的——确实有一个可选的单语句主体语法,但那又怎样。许多人对除类方法之外的所有函数定义使用箭头,并将function关键字降级为语言的“坏部分”。这样做是有充分理由的。对于这些人来说,缺少箭头生成器是令人讨厌的不一致。
2021-03-17 15:15:32
我已经遇到了一些场景,我使用的生成器需要访问前一个this,并且必须编写let self = thishack 才能在生成器中访问它。词法作用域 + 箭头语法本来不错。不幸的是,但不完全是世界末日。
2021-03-18 15:15:32
对我来说感觉像是设计缺陷。
2021-03-21 15:15:32
@callum 我的意思是在实例创建和调用开销方面是轻量级的,而不是语法。不确定您认为它们背后的原因是什么。不,我没有看到在function声明上使用非声明性箭头函数表达式的任何充分理由
2021-03-25 15:15:32
@Jonathon:不。箭头函数应该是轻量级的(.prototype例如没有)并且通常是单行的,而生成器则恰恰相反。
2021-04-03 15:15:32

内联函数和箭头函数的区别

首先,箭头函数 () => {}不是用来代替内联函数的function(){},它们是不同的。内联函数只是函数,所以问题是箭头函数和内联函数之间的区别是什么。

相比函数表达式的箭头函数表达式(也称为箭头功能)具有较短的语法,并且不结合其自身的thisargumentssuper,或new.target)。箭头函数总是匿名的。

这里有一些更快速的细节


为什么箭头函数不能用作生成器

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

使用 yield 关键字

产率的关键字可能无法在箭头函数体中使用(除了当进一步嵌套在功能在允许范围内)。因此,箭头函数不能用作生成器。

请注意,没有的生成器没有yield意义。


为什么箭头函数不能使用yield

http://tc39wiki.calculist.org/es6/arrow-functions/

箭头函数this词法上绑定return,在Block主体情况下绑定因此它从直接封闭的箭头函数返回,并排除breakcontinue引用直接封闭的箭头函数之外的语句。

标识符初级表达arguments可能无法在箭头函数体被使用(是否表达或块形式)。

同样,yield不能在箭头函数的主体中使用。箭头不能是生成器,我们不想要深度延续。

箭头函数中的产量将引发语义错误:http : //www.ecma-international.org/

归根结底,原因在于 ECMA6 实施的深度复杂性。由于类似的原因, C# 也不允许这样做

这是循环推理;箭头函数不能是生成器,因为它不允许有yield语句,也不能有yield语句,因为它不允许是生成器。🤨
2021-03-17 15:15:32
我想弄清楚为什么*() => { yield bla; }不行,但是async () => { await bla; }...
2021-03-23 15:15:32
这并没有真正回答为什么是的,这是真的,箭头函数不能是生成器,因为它不允许包含yield,但没有理由设计语法允许它。设计师不希望箭头函数成为生成器的原因是什么?
2021-03-26 15:15:32
@CodeiSir,Re“我们不想要深度的延续”,糟糕的借口。
2021-03-28 15:15:32
你的论点是周期性的。你说箭头函数不能是生成器,因为它们不能包含 yield 关键字。但是它们不能有 yield 关键字,因为它们不能是生成器:“箭头不能是生成器,我们不想要深度延续。”
2021-03-30 15:15:32

除了上面提到的esdiscuss.orgEcma TC39 委员会 ES6 会议纪要上的讨论之外2013 年 11 月,在 2016 年 9 月的两次 ES7 会议中重新讨论了生成器箭头[1] [2]在讨论了各种语法(主要是=*>=>*)的优缺点以及此功能缺乏理由和用例后,他们得出的结论是:

  • 委员会有一些兴趣,但担心该功能不会为添加新语法而发挥作用
  • =>*作为 [Domenic Denicola] 的异步迭代提案的一部分,计划在第 3 天重新访问,看看我们是否可以至少达到第 0 阶段

发电机箭头的提议被移至第一阶段,Brendan Eich 和 Domenic Denicola 作为冠军。上述异步迭代于2018年完成并实现

2019 年 10 月,谢尔盖·鲁巴诺夫 (Sergey Rubanov) 的官方回购出现了更多关于语法和其他细节的讨论。

我也有同样的问题,来到这里。阅读帖子和评论后,我觉得在箭头函数中使用生成器似乎很模糊:

const generator = () => 2*3; // * implies multiplication
// so, this would be a confusing
const generator = () =>* something; // err, multiplying?
const generator = () =*> ... // err, ^^
const generator = ()*=> ... // err, *=3, still multiplying?
const generator=*()=> ... // err, ^^
const generator = *param => ... //err, "param" is not fixed word

这可能是他们没有实现与箭头函数相关的生成器的重要原因。


但是,如果我是其中之一,我可能会这样想:

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^

这感觉就像我们有异步函数:

const asyncFunction = async () => ... // pretty cool

因为,在普通函数中存在async关键字,所以箭头函数正在使用它 -async () =>可能看起来是async function()

但是,没有像genor这样的关键字generator,唉,箭头函数没有使用它。

总结:

即使他们希望在箭头函数中实现生成器,我认为他们需要重新考虑核心js中的生成器语法:

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}

这将是一个大错误。因此,将箭头函数排除在生成器之外,非常酷。


以下@Bergi 评论

不。箭头函数应该是轻量级的(例如没有 .prototype)并且通常是单行的,而生成器则恰恰相反。

我会说生成器的使用目的是运行-停止-运行,所以我认为我们不需要关心原型、词法 this 等。

也可以考虑异国情调的选项,例如() ~> { yield 'a'; yield 'b'; }. 老实说,我只是喜欢波浪号。
2021-03-15 15:15:32
@Gershom 这就是像Perl这样的编程语言完全出错的原因
2021-04-01 15:15:32

现在你不能,但未来你可能会因为2019 年 10 月的TC39 发布提案,这是在第一阶段。