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)
Cod*_*rPi 123
首先,不使用箭头函数 () => {}
来替换内联函数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
,在块体大小写中绑定,使其从直接封闭的箭头函数返回,并排除break
和continue
引用直接封闭箭头函数之外的语句.的标识符初级表达
arguments
可能无法在箭头函数体被使用(是否表达或块形式).同样,
yield
不能在箭头功能的身体中使用.箭头不能是生成器,我们不希望深度延续.
箭头函数中的收益会引发语义错误:http://www.ecma-international.org/
最后,原因在于ECMA6的实施过程非常复杂.由于某些类似的原因, C#也不允许这样做.
mon*_*ime 27
除了上面提到的2013年11月esdiscuss.org和Ecma TC39委员会ES6会议记录的讨论之外,2016年9月ES7会议[1] [2]重新审视了发电机箭头.在讨论了各种语法(主要=*>
和=>*
)的利弊以及缺乏对此功能的理由和用例之后,他们得出结论:
- 委员会对此有一些兴趣,但担心该功能不会增加新的语法
- 计划在第3天重新访问,看看我们是否可以
=>*
至少进入第0阶段,作为[Domenic Denicola]的异步迭代提案的一部分
发电机箭头的提议被移到第一阶段,Brendan Eich和Domenic Denicola作为冠军,但相关的tc39 /提案回购尚未存在.我假设有进一步的消息,我必须等到阶段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
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),并且通常是单行的,而生成器则相反。
我会说生成器的使用目的是运行-停止-运行,因此,我认为我们不需要关心原型,词法分析等等。
归档时间: |
|
查看次数: |
52601 次 |
最近记录: |