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

Ash*_*man 209 javascript generator ecmascript-6 arrow-functions

即我该如何表达:

function *(next) {}
Run Code Online (Sandbox Code Playgroud)

带箭头.我已经尝试了所有我能想到的组合,而且我找不到任何关于它的文档.

(目前使用节点v0.11.14)

小智 192

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

你不能.抱歉.

MDN称

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

规范文件(我的重点):

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

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"
Run Code Online (Sandbox Code Playgroud)

  • 感觉就像一个设计缺陷给我. (150认同)
  • 我已经遇到了一些场景,我正在玩的生成器需要访问之前的`this`,并且必须编写`let self = this` hack以便在生成器内访问它.词法范围+箭头语法本来不错.不幸的是,但并不完全是世界末日. (31认同)
  • @Jonathon:不.箭头函数应该是轻量级的(并且没有例如`.prototype`)并且通常是单行的,而生成器几乎是相反的. (16认同)
  • @Bergi箭头函数背后的推理要复杂得多.这不是真正的简洁.箭头函数不需要是轻量级的 - 确实有一个可选的单语句体语法,但那是什么.许多人对除了类方法之外的所有函数定义都使用箭头,并将`function`关键字降级为该语言的"坏部分".有充分的理由这样做.对于这些人来说,箭头发生器的缺乏是令人烦恼的不一致. (12认同)
  • 围绕这个的一些额外背景[esdiscuss](https://esdiscuss.org/topic/generator-arrow-functions) (3认同)
  • @callum我确实在实例创建和调用开销方面表示轻量级,而不是语法.不确定你认为他们背后的推理是什么.不,我没有看到任何有理由使用非声明性箭头函数表达式而不是`function`声明. (3认同)
  • @Bergi:你知道他们在表面下是否有不同的处理方式吗?事情可能已经改变,但上次我检查箭头函数只是自动包装在`bind()`中的正常函数. (2认同)
  • @Jonathon:我不认为他们曾经.它们可能被转换成`.bind`,但这并不是它们在ES6中的推测方式. (2认同)

Cod*_*rPi 123

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

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

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

这里有一些更快速的细节


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

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

使用yield关键字

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

请注意,发电机没有yield任何意义.


为什么Arrow函数不能使用yield

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

箭头函数以this词法方式绑定return,在体大小写中绑定,使其从直接封闭的箭头函数返回,并排除breakcontinue引用直接封闭箭头函数之外的语句.

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

同样,yield不能在箭头功能的身体中使用.箭头不能是生成器,我们不希望深度延续.

箭头函数中的收益会引发语义错误:http://www.ecma-international.org/

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

  • 我想弄清楚为什么`*()=> {yield bla; }`不行,但是`async()=> {等待bla; }是...... (54认同)
  • 你的论点是周期性的。你说箭头函数不能是生成器,因为它们不能有 yield 关键字。但是它们不能有 yield 关键字,因为它们不能是生成器:“箭头不能是生成器,我们不想要深度延续。” (25认同)
  • 这是循环推理;箭头函数不能是生成器,因为它不允许有“yield”语句,并且它不能有“yield”语句,因为它不允许是生成器。 (9认同)
  • 这并不能真正回答*为什么*。是的,确实如此,箭头函数不能成为生成器,因为它不允许包含“yield”,但没有理由设计语法来允许它。设计者不希望箭头函数成为生成器的原因是什么? (5认同)
  • @CodeiSir,Re"*我们不想要深刻的延续*",糟糕的借口. (4认同)
  • 你不回答为什么。只是说不能,但为什么呢? (4认同)
  • 我使用了搜索引擎,并为您发布了一个解释 (3认同)
  • 说“箭头函数在词法上绑定 `this`”是一种误导:相反,它们不会像非箭头函数那样隐式_引入_本地 `this`。因此,对“this”的任何引用都会绑定到最内层封闭非箭头函数作用域引入的变量,这与对“x”的任何引用绑定到引入一个的最内层作用域中具有该名称的变量的方式完全相同。 。 (2认同)

mon*_*ime 27

除了上面提到的2013年11月esdiscuss.orgEcma TC39委员会ES6会议记录的讨论之外,2016年9月ES7会议[1] [2]重新审视了发电机箭头.在讨论了各种语法(主要=*>=>*)的利弊以及缺乏对此功能的理由和用例之后,他们得出结论:

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

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


Bho*_*yar 7

我也有同样的问题,来到这里。阅读帖子和评论后,我觉得在箭头函数中使用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
Run Code Online (Sandbox Code Playgroud)

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


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

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^
Run Code Online (Sandbox Code Playgroud)

感觉就像我们有异步功能:

const asyncFunction = async () => ... // pretty cool
Run Code Online (Sandbox Code Playgroud)

因为使用正常功能存在async关键字,所以箭头功能正在利用它- async () =>似乎很可能async function()

但是,没有像gen或的关键字,generator而且箭头功能未使用它。

结论:

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

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}
Run Code Online (Sandbox Code Playgroud)

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


以下@Bergi评论

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

我会说生成器的使用目的是运行-停止-运行,因此,我认为我们不需要关心原型,词法分析等等。

  • @Gershom 这就是像 [Perl](https://en.wikipedia.org/wiki/Perl) 这样的编程语言完全错误的原因 (6认同)
  • 也可以考虑外来选项,例如 `() ~> { yield 'a'; 产量“b”;}`。老实说,我只是喜欢波浪号。 (4认同)
  • 我发现解决方案 `const someGeneratorFunction = gen () => ...` 非常漂亮。 (3认同)

Gou*_*ija 5

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


归档时间:

查看次数:

52601 次

最近记录:

5 年,10 月 前