为什么ES6没有细箭头功能?


16

ES6添加了胖箭头功能(=>),与正常功能有两个主要区别:

  • 较短的语法(如果使用单表达式主体,则包括隐式返回)
  • this从周围范围继承

这两个都是非常有用的功能,但在我看来它们的价值和应用程序是完全分开的–有时我想要一个或另一个,或者两者兼而有之,或者都不想要。如果我想使用短语法功能,我必须使用this-modifying行为,这似乎很奇怪。反之亦然。我不明白为什么将这两种功能作为语言的一个附加实现而实现。

如果我想为它的隐式返回和简洁性使用一个短语法函数(在某些情况下,完整的function (..) { return ...}可读性会稍差一些),但是我想this在我的函数中使用它来引用调用上下文,该怎么办?没有办法做到这一点。

CoffeeScript同时具有->=>样式功能,并且显然ES6是=>从那里借来的样式。所以我的问题是,为什么ES6也没有借用->样式?


fat-arrow函数还有其他区别,就像它们不能绑定一样arguments
DeadMG

如果有时只需要周围的作用域,则始终可以this在完整的函数声明中绑定到闭包。但是,这可能不是您关注的部分。

Answers:


25

请参阅添加箭头功能的建议:http : //wiki.ecmascript.org/doku.php?id= harmony: arrow_function_syntax 1

它说的是:

但是,我们不希望使用CoffeeScript的->,因为有两个箭头而令人困惑,并且动态绑定是经常发射的步枪。

您还可以看到对提案的先前版本的一些讨论,该版本也具有->语法:https : //esdiscuss.org/topic/arrow-function-syntax-simplified

它似乎可以归结为以下几点:

  1. 具有两种语义不同的箭头语法会增加复杂性和混乱性。
  2. 动态绑定此function()->并被认为很少有用,并且是步枪。
  3. 如果您确实需要动态绑定,您仍然可以使用function(),但使用快捷方式语法并不是很有帮助。

1
+1。特别要注意的是,ES6是引入这些功能的第二次尝试,这些功能原本计划包含在ES4中,但是当主要利益相关者认为它太复杂并可能破坏向后兼容性时,该规范就被放弃了。尽可能使一切保持简单是这次委员会的重要目标。
Jules

1
感谢您的回答,但我认为它不能解决问题。更少并不意味着更简单。我认为要获得不同的此绑定逻辑(与切换单个字符相比),必须在两种非常不同的函数语法之间进行切换会更加复杂。具有“具有不同语义的多种功能”并不是一个糟糕的主意。这正是我们实际上拥有的。而且我不认为向后兼容性与我们正在谈论的任何内容有关。我并不是建议他们应该删除对经典函数语法的支持,如果那是您的意思
callum 2015年

2
@callum,(至少在做出此决定的人们中)共识是,function()这种绑定的样式是一个错误,并且是对语言的一种扭曲。如果可以的话,它们会更改function()为具有=>语义,但是不能这样做,因为那样会破坏向后兼容性。
温斯顿·埃韦特2015年

2
@WinstonEwert坚持下去,您是说做出决定的人们会首选,如果他们能够像这样从周围范围function()继承过来的话?在那种情况下,难道不只是到处都引用全局对象吗?听起来怪怪的。你是从哪里听来的?this=>this
卡伦

3
这可能有一个可接受的答案,但似乎语言设计不佳。如果您的语言要求粗箭头,那么细箭头也应该可用。前者迫使每个人都开始根据对象进行思考,而后者则首先承认javascript的功能设计历史,并承认上下文的延迟。
核心
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.