ES6箭头函数和CoffeeScript的胖箭头函数有哪些关键区别?

3
我希望将一些CoffeScript代码改写成ECMAScript 2015 (ES6)。
有些语法非常相似,例如箭头函数:
(param1, param2, paramN) => expression

ES6CoffeeScript之间的主要区别是什么?

最好能从已经处于相同情况(来回转换箭头函数)的人那里得到预警,并指出需要避免的陷阱和错误。


1
我认为 CoffeeScript 的箭头函数是“胖”的,而不是 ES6 的箭头函数 :P - user405398
1
我从未使用过 CoffeeScript 的箭头函数。但是,关于 ES6 箭头函数,需要注意的一件事是它没有 arguments 变量。 - user405398
1
看这些文档,CoffeeScript的实现只捕获了this的引用并将其传递给闭包。ES6的实现确保函数*没有this*,因此使用其父级词法绑定的this。对于superargumentsnew.target也是如此 - CoffeeScript的fat arrow不会"绑定"它们。 - CodingIntrigue
2
官方术语是"箭头函数"(在ES6中),无论MDN如何描述。与CoffeeScript不同,ES6中没有"细"箭头。 - Felix Kling
1
考虑到CoffeeScript箭头函数基本上是解糖成绑定函数(即使它们将bind()调用解糖成闭包),这似乎是ES6箭头函数和绑定函数之间的区别是什么?的重复。 - Bergi
显示剩余2条评论
1个回答

1
咖啡编程语言中的Fat-arrow函数会转换为常规的JavaScript函数,并将“this”绑定到其词法作用域(即定义的作用域)中的值。如下所示:
sum = (a, b) =>
  return a + b

JavaScript转译
var sum;
sum = (function(_this) {
  return function(a, b) {
    return a + b;
  };
})(this);

ES2015中的箭头函数始终会执行this绑定。
let arrowFunction = () => this.property

在 ES5 中,这个代码的翻译如下

let arrowFunction = (function () { return this.property }).bind(this)

由于箭头函数中的this不能被绑定到其他任何东西,因此它们不能与new关键字一起使用,因为后者需要将this绑定到一个新对象。

在“普通”的JavaScript函数(非箭头函数)作用域中,有一个特殊的arguments变量可供访问,它是“类似数组”的,并且有助于访问传递给函数的所有参数,而不管参数签名如何。当然,在CoffeeScript的fat-arrow函数中也是如此。在我的sum示例中,如果有人调用它作为sum(1, 2, 3),则可以通过执行argument[2]来访问第三个参数。箭头函数不提供arguments,但具有“rest参数”。后者在CoffeeScript中也存在,他们称之为“splats”。

CS fat-arrow函数和JS箭头函数都支持默认参数值。我知道这不是一个区别,但我认为值得一提。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接