Javascript 我可以使用ES6';带生成器的s箭头函数语法?(箭头符号)

Javascript 我可以使用ES6';带生成器的s箭头函数语法?(箭头符号),javascript,ecmascript-6,syntax,generator,arrow-functions,Javascript,Ecmascript 6,Syntax,Generator,Arrow Functions,也就是说,我该如何表达 function *(next) {} 使用箭头语法?我尝试了所有我能想到的组合,但我找不到任何关于它的文档 (我目前正在使用Node.js v0.11.14。) 我可以在生成器中使用ES6的箭头函数语法吗 你不能。对不起 据 function*语句(function关键字后跟星号)定义了生成器函数 从a(我的重点): 函数语法扩展为添加可选的*标记: 内联函数和箭头函数之间的区别 首先,()=>{}不是用来替换内联函数的,它们是不同的。 内联函数只是函数,所以问题是箭

也就是说,我该如何表达

function *(next) {}
使用箭头语法?我尝试了所有我能想到的组合,但我找不到任何关于它的文档

(我目前正在使用Node.js v0.11.14。)

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

你不能。对不起

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

从a(我的重点):

函数语法扩展为添加可选的
*
标记:

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

与函数表达式相比,箭头函数表达式(也称为箭头函数)的语法更短,并且不绑定其自身的
this
参数
super
new.target
)。箭头函数总是匿名的

一些更快速的细节


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

使用收益率关键字

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

请注意,如果没有
收益
就没有意义


为什么箭头函数不能使用收益率

箭头函数按词汇绑定
,在块体的情况下绑定
返回
,使其从立即包围的箭头函数返回,并防止
中断
继续
引用立即包围的箭头函数外的语句

标识符主表达式
参数
不能用于arrow函数体(表达式或块形式)

同样地,
yield
也不能在arrow函数的主体中使用。箭头不可能是发电机,我们不希望有深度的延续

箭头函数中的Yield将抛出语义错误:


归根结底,原因在于ECMA6实现的深层复杂性。C#也不允许类似的情况出现。

除了上述讨论之外,2016年9月的两次ES7会议再次讨论了generator arrows。在讨论了各种语法(主要是
=*>
=>*
)的优缺点以及该功能缺乏正当理由和用例后,他们得出结论:

  • 委员会对此表示了一些兴趣,但担心该功能在添加新语法时没有发挥作用
  • 计划在第3天再次访问,看看我们是否能够至少将
    =>*
    阶段0作为[Domenic Denicola]异步迭代计划的一部分
发电机箭的提议被转移到与布伦丹艾奇和多梅尼克丹尼科拉作为冠军。上面提到的是2018年


2019年10月出现了更多关于语法和其他细节的讨论。

我知道这已经很晚了,但另一个可能的原因可能是语法。也许
(*()=>{})
有效,但是
(9**()=>{})
呢?是9乘以箭头函数的幂,返回
NaN
,还是9乘以发电机箭头函数,也返回
NaN
?这可以通过一些替代语法来实现,比如这里的另一个答案中提到的
=>*
,但是在实现时可能希望保持生成器函数语法的一致性(例如
函数*(){}
{*genMethod(){}
)。这不是一个太多的借口,而是一个理由。

redux传奇有一个很好的解决办法

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

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

我也有同样的问题,来到这里。阅读帖子和评论后,我觉得在箭头函数中使用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
这可能是他们没有实现与arrow函数相关的generator的主要原因


但是,如果我是他们中的一员,我会这样想:

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^
这感觉就像我们有异步函数:

const asyncFunction = async () => ... // pretty cool
因为,对于普通函数,async关键字存在,所以箭头函数正在使用它-
async()=>
很可能看起来是
async function()

但是,没有像
gen
generator
这样的关键字,唉,arrow函数没有使用它

总结如下:

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

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}
这将是一个大错误。因此,将箭头函数从生成器中排除是非常酷的


以下:

不需要。箭头函数应该是轻量级的(比如没有原型),通常只有一行程序,而生成器则恰恰相反


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

现在你不能,但将来你可能会,因为TC39将在2019年10月发布,这是在第1阶段。

你不能。很抱歉“function*语句(function关键字后跟星号)定义了一个生成器函数。”请注意,关于这个主题的讨论有点冗长。您希望
param*=>{}
做什么?您知道
function(){}
()=>{}
做的不一样?“真的是ES6生成器向前两步,向后一步吗?”-不,:-)对我来说就像是一个设计缺陷。@Jonathon:不。箭头函数是s
generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}