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

时间:2014-12-26 19:51:26

标签: javascript node.js generator ecmascript-6 arrow-functions

即我如何表达:

function *(next) {}
带箭头的

我已经尝试了所有我能想到的组合,而且我找不到任何文档。

(目前使用节点v0.11.14)

7 个答案:

答案 0 :(得分:164)

  

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

你做不到。抱歉。

根据MDN

  

function*语句(function关键字后跟星号)定义了生成器函数。

spec document(我的重点):

  

扩展功能语法以添加可选的*令牌:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"

答案 1 :(得分:104)

内联函数和箭头函数

之间的区别

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

  

与函数表达式相比,箭头函数表达式(也称为箭头函数)具有更短的语法,并且不绑定自己的thisargumentssuper或{{1 }})。箭头功能始终是匿名的。

更快速的详细信息here

为什么Arrow-function不能用作生成器

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

  

使用yield关键字

     

yield关键字不能在箭头函数体中使用(除非在进一步嵌套在其中的函数中允许)。因此,箭头函数不能用作生成器。

请注意,generators没有new.target没有意义。

为什么Arrow-function不能使用yield

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

  

箭头函数以词法方式绑定yield,绑定{em> Block 正文案例中的this,使其从直接封闭的箭头函数返回,并排除return和{ {1}}来自直接封闭箭头函数之外的引用语句。

     

标识符主要表达式break不能用于箭头函数体(无论是表达式还是块形式)。

     

同样,continue可能不会用在箭头功能的正文中。箭头不能是生成器,我们不希望深度延续。

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

最后,原因在于ECMA6的实施过程非常复杂。对于有些类似的reasons,C#也不允许这样做。

答案 2 :(得分:23)

除了上述esdiscuss.orgthe Ecma TC39 committee ES6 meeting notes from November 2013的讨论之外,2016年9月的ES7会议[1] [2]重新审视了生成箭头。在讨论了各种语法的优缺点(主要是=*>=>*)以及缺乏对此功能的理由和用例之后,他们得出结论:

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

发电机箭头的提议已移至第1阶段,Brendan Eich和Domenic Denicola为冠军,但相关的tc39/proposals回购尚不存在。我假设有进一步的消息,我们必须等到阶段3异步迭代提议最终确定。

答案 3 :(得分:3)

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

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()

但是,没有像gengenerator这样的关键字,而且可惜箭头功能未使用它。

总结:

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

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

这将是一个大错误。因此,将箭头功能保持在生成器之外非常酷。


@Bergi comment之后:

  

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

我会说生成器的使用目的是 run-stop-run ,因此,我认为我们不需要关心原型,词汇表等等。

答案 4 :(得分:3)

现在您还不能,但是将来可能是因为TC39发行版proposal将于2019年10月(即第1阶段)发布。

答案 5 :(得分:2)

我知道这已经很晚了,但另一个可能的原因可能是语法。也许(*() => {})有效,但(9 ** () => {})呢?这是9的箭头功能,返回NaN,还是生成箭头函数的9倍,还返回NaN?它可以通过一些替代语法来完成,比如=>*,如此处的另一个答案所提到的,但也许需要保持生成器函数语法的一致性(例如function* () {}和{{1}当它被实施时。不是太多的借口,而是一个理由。

答案 6 :(得分:0)

redux-saga有一个不错的解决方法

import { call, all } from 'redux-saga/effects';

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}