【问题标题】:What are the key differences between ES6 arrow function and the CoffeeScript fat arrow function?ES6 箭头函数和 CoffeeScript 粗箭头函数之间的主要区别是什么?
【发布时间】:2016-01-25 15:17:26
【问题描述】:

我希望将一些 CoffeScript 代码重写为 ECMAScript 2015 (ES6)。

一些语法非常相似,例如粗箭头函数:

(param1, param2, paramN) => expression

ES6 =>CoffeeScript => 之间的主要区别是什么?

最好从已经处于相同情况(来回转换箭头功能)的人那里获得提示,并指出要避免的陷阱和错误。

【问题讨论】:

  • 我认为咖啡脚本箭头函数是fat,而不是es6箭头函数:P
  • 我没用过咖啡脚本箭头功能。但是,关于 es6 箭头函数,需要注意的一点是,它没有 arguments 变量。
  • 查看那些文档,CoffeeScript 的实现只捕获对this 的引用并将其传递给闭包。 ES6 的实现确保函数没有this,因此使用它的父级词法绑定thissuperargumentsnew.target 也是如此——CoffeeScript 的粗箭头不会“绑定”这些
  • 无论 MDN 怎么说,ES6 中的官方术语都是"arrow function"。 ES6 中没有“细”箭头(与 CoffeeScript 不同)。
  • 鉴于咖啡脚本箭头基本上对绑定函数进行了脱糖(即使他们将 bind() 调用脱糖到闭包中),这似乎是 What are the differences between ES6 arrow functions and bound functions? 的副本

标签: javascript coffeescript ecmascript-6 arrow-functions


【解决方案1】:

CoffeeScript 中的胖箭头函数转换为您常用的 JavaScript 函数,并将 this 绑定到它在词法范围(定义范围)中的值。像这样:

CoffeeScript

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 粗箭头函数中也是如此。在我的sum 示例中,如果有人将其称为sum(1, 2, 3),则可以通过argument[2] 访问第三个参数。箭头函数不提供arguments,但有“剩余参数”。后者也存在于 CoffeeScript 中,他们称之为“splats”。

CS 粗箭头函数和 JS 箭头函数都支持默认参数值。这没什么区别,我知道,但值得一提的是 IMO。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多