也就是说,我如何表达
function *(next) {}
使用箭头语法?我已经尝试了所有我能想到的组合,但我找不到任何关于它的文档。
(我目前使用的是 Node.js v0.11.14。)
也就是说,我如何表达
function *(next) {}
使用箭头语法?我已经尝试了所有我能想到的组合,但我找不到任何关于它的文档。
(我目前使用的是 Node.js v0.11.14。)
首先,箭头函数 () => {}
不是用来代替内联函数的function(){}
,它们是不同的。内联函数只是函数,所以问题是箭头函数和内联函数之间的区别是什么。
相比函数表达式的箭头函数表达式(也称为箭头功能)具有较短的语法,并且不结合其自身的
this
,arguments
,super
,或new.target
)。箭头函数总是匿名的。
这里有一些更快速的细节
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
使用 yield 关键字
的产率的关键字可能无法在箭头函数体中使用(除了当进一步嵌套在功能在允许范围内)。因此,箭头函数不能用作生成器。
请注意,没有的生成器没有yield
意义。
http://tc39wiki.calculist.org/es6/arrow-functions/
箭头函数在
this
词法上绑定return
,在Block主体情况下绑定,因此它从直接封闭的箭头函数返回,并排除break
和continue
引用直接封闭的箭头函数之外的语句。的标识符初级表达
arguments
可能无法在箭头函数体被使用(是否表达或块形式)。同样,
yield
不能在箭头函数的主体中使用。箭头不能是生成器,我们不想要深度延续。
箭头函数中的产量将引发语义错误:http : //www.ecma-international.org/
归根结底,原因在于 ECMA6 实施的深度复杂性。由于类似的原因, C# 也不允许这样做。
除了上面提到的esdiscuss.org和Ecma 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()
。
但是,没有像gen
or这样的关键字generator
,唉,箭头函数没有使用它。
总结:
即使他们希望在箭头函数中实现生成器,我认为他们需要重新考虑核心js中的生成器语法:
generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}
这将是一个大错误。因此,将箭头函数排除在生成器之外,非常酷。
以下@Bergi 评论:
不。箭头函数应该是轻量级的(例如没有 .prototype)并且通常是单行的,而生成器则恰恰相反。
我会说生成器的使用目的是运行-停止-运行,所以我认为我们不需要关心原型、词法 this 等。
现在你不能,但未来你可能会因为2019 年 10 月的TC39 发布提案,这是在第一阶段。