babel/packages/babel-plugin-transform-arrow-functions
Diogo Franco 81811bf1b9 Fix transform-arrow-functions in { spec: true } shadowing (#6760)
* Fix transform-arrow-functions in { spec: true } shadowing

The function name matching the variable declaration name could
shadow the actual function object inside the generated function,
leading to invalid behavior due to holding a reference to the
original unbound function.

* Combine it with transform-function-name just to be sure in spec: false

* Revert "Fix transform-arrow-functions in { spec: true } shadowing"

This reverts commit 1cafe2561d0b0ddd181b956a85eb074621da12e8.

* Much simpler version of the above fix

* Missing fixture updates

* Avoid using rest/spread to make the tests pass on node 4

* ...actually update _all_ the fixtures
2017-11-08 17:21:30 -05:00
..
2017-11-03 16:03:01 -04:00

@babel/plugin-transform-arrow-functions

Compile ES2015 arrow functions to ES5

Example

In

var a = () => {};
var a = (b) => b;

const double = [1,2,3].map((num) => num * 2);
console.log(double); // [2,4,6]

var bob = {
  _name: "Bob",
  _friends: ["Sally", "Tom"],
  printFriends() {
    this._friends.forEach(f =>
      console.log(this._name + " knows " + f));
  }
};
console.log(bob.printFriends());

Out

var a = function () {};
var a = function (b) {
  return b;
};

const double = [1, 2, 3].map(function (num) {
  return num * 2;
});
console.log(double); // [2,4,6]

var bob = {
  _name: "Bob",
  _friends: ["Sally", "Tom"],
  printFriends() {
    var _this = this;

    this._friends.forEach(function (f) {
      return console.log(_this._name + " knows " + f);
    });
  }
};
console.log(bob.printFriends());

Installation

npm install --save-dev @babel/plugin-transform-arrow-functions

Usage

.babelrc

Without options:

{
  "plugins": ["@babel/transform-arrow-functions"]
}

With options:

{
  "plugins": [
    ["@babel/transform-arrow-functions", { "spec": true }]
  ]
}

Via CLI

babel --plugins @babel/transform-arrow-functions script.js

Via Node API

require("@babel/core").transform("code", {
  plugins: ["@babel/transform-arrow-functions"]
});

Options

spec

boolean, defaults to false.

Example

Using spec mode with the above example produces:

var _this = this;

var a = function a() {
  babelHelpers.newArrowCheck(this, _this);
}.bind(this);
var a = function a(b) {
  babelHelpers.newArrowCheck(this, _this);
  return b;
}.bind(this);

const double = [1, 2, 3].map(function (num) {
  babelHelpers.newArrowCheck(this, _this);
  return num * 2;
}.bind(this));
console.log(double); // [2,4,6]

var bob = {
  _name: "Bob",
  _friends: ["Sally", "Tom"],
  printFriends() {
    var _this2 = this;

    this._friends.forEach(function (f) {
      babelHelpers.newArrowCheck(this, _this2);
      return console.log(this._name + " knows " + f);
    }.bind(this));
  }
};
console.log(bob.printFriends());

This option enables the following:

  • Wrap the generated function in .bind(this) and keeps uses of this inside the function as-is, instead of using a renamed this.

  • Add a runtime check to ensure the functions are not instantiated.

  • Add names to arrow functions.