JavaScript ES6+ : Arrow Functions

Follow me on twitter @jaymanpandya

Arrow functions are new in ES6. They are concise, have implicit returns and does not rebound the value of “this” when arrow function is used inside another function.

const moduleNames = ["One", "Club", "Finance"];

// Map names without Arrow functions
const moduleFullNames = moduleNames.map(function(moduleNames) {
  return `Zip ${moduleNames}`;
});
console.log(moduleFullNames); // The console will print ["Zip One", "Zip Club", "Zip Finance"]


// Map names with Arrow functions
const moduleFullNamesWithArrowFunction = moduleNames.map((moduleNames) => {
  return `Zip ${moduleNames}`;
});
console.log(moduleFullNamesWithArrowFunction); // The console will print ["Zip One", "Zip Club", "Zip Finance"]

You can skip wrapping the variable in parenthesis when only one parameter is passed

// Map names with Arrow functions without parenthesis
const moduleFullNamesWithArrowFunctionNoBrackets = moduleNames.map(moduleNames => {
  return `Zip ${moduleNames}`;
});
console.log(moduleFullNamesWithArrowFunctionNoBrackets); // The console will print ["Zip One", "Zip Club", "Zip Finance"]

Implicit returns

// Map names with Arrow functions without parenthesis
const moduleFullNamesWithArrowFunctionImplicitReturns = moduleNames.map(moduleNames => `Zip ${moduleNames}`);
console.log(moduleFullNamesWithArrowFunctionImplicitReturns); // The console will print ["Zip One", "Zip Club", "Zip Finance"]

Arrow functions are always anonymous. If you want to add an identifier to the Arrow function, you can assign it to a variable

// Assign Arrow function to a variable and map the module names in shorthand
const namedArrowFunction = (moduleNames) => { alert(`Zip ${moduleNames}`)};
namedArrowFunction('One'); // The alert box will show "Zip One"

Implicit returns with an Object Literal using Arrow functions

const visitors = ['Rashmi', 'Jayman'];

//Return the object using the Map function
const name = visitors.map((visitor, i) => ({name: visitor, id: i+1}));

Will output Rashmi | 1 & Jayman | 2

One more example. Try to find # of children in the club using Implicit returns using arrow functions

const agesOfPeopleInTheClub = [4, 32, 6, 9, 15, 17, 12, 24, 60];
const filterChildren = agesOfPeopleInTheClub.filter(child => child <= 18); // Will return an array [4,6,9,15,17,12]

Assign default parameter value when declaring a parameter that will be passed in a function

//Define tax & interest parameters with pre-defined values of 18% & 20% respectively
function calculateMonthlyMaintenanceBill(total, tax = 0.18, clubFees, prevOutstandings, interest = 0.20) {
  return(total + (total * tax) + clubFees + prevOutstandings + (prevOutstandings * interest));
}

//Passing the parameter as undefined as the value is already setup. This can be overridden with any other value also.
const MonthlyMaintenanceBill = calculateMonthlyMaintenanceBill(10, undefined, 5, 10, undefined);

console.log(MonthlyMaintenanceBill);

While Arrow function is very useful and effective shorthand way of writing functions, it cannot be used in every scenario. Here are 4 scenarios in which you cannot use Arrow functions

#1 : When you need access to “this“, as “this” keyword does not get rebound when you use Arrow Function

// "this" won't work here
const button = document.querySelector('.button');

button.addEventListener('click', => {
  console.log(this) //Output of 'this' will be Window instead of button.
});

// "this" will work here
const newButton = document.querySelector('.button');

newButton.addEventListener('click', function() {
  console.log(this) //Output of 'this' will be Button as intended
});

#2 : When you want a method to bind to an object

// "this" won't work here
const member = {
  memberSince :76,
  update: () => {
    this.memberSince++;
  }
}

// "this" will work here
const member = {
  memberSince : 76,
  update: function() {
    this.memberSince++;
  }
}

#3 : When you need to add the prototype

// "this" won't work here
class MemberCars {
  constructor(nameOfMember, make, model, color) {
    this.nameOfMember = nameOfMember;
    this.make = make;
    this.model = model;
    this.color = color;
  }
}

const a401 = new MemberCars('Jayman', 'Volkswagen', 'Vento', 'White');
const d1306 = new MemberCars('Rashmi', 'Hyundai', 'Grand i10', 'Grey');
const b704 = new MemberCars('Hazel', 'Toyota', 'Corolla Altis', 'Blue');

MemberCars.prototype.summarize = () => {
  return`${this.nameOfMember} owns ${this.color} ${this.make} ${this.model}.`
}

// "this" will work here
class MemberCars {
  constructor(nameOfMember, make, model, color) {
    this.nameOfMember = nameOfMember;
    this.make = make;
    this.model = model;
    this.color = color;
  }
}

const a401 = new MemberCars('Jayman', 'Volkswagen', 'Vento', 'White');
const d1306 = new MemberCars('Rashmi', 'Hyundai', 'Grand i10', 'Grey');
const b704 = new MemberCars('Hazel', 'Toyota', 'Corolla Altis', 'Blue');

MemberCars.prototype.summarize = function() {
  return`${this.nameOfMember} owns ${this.color} ${this.make} ${this.model}.`
}

#4 : When you need to access arguments object

// "this" won't work here
const itemsOrdered = () => {
  const items = Array.from(arguments);
  return items.map((item, i) => {
    return `${i + 1} | ${item}`;
  })
  console.log(arguments);
}

// "this" will work here
const itemsOrdered = function() {
  const items = Array.from(arguments);
  return items.map((item, i) => {
    return `${i + 1} | ${item}`;
  })
  console.log(arguments);
}

Arrow functions are very good at some places and can cause undefined errors, so have to be used carefully.

As Uncle Ben has said “With great power comes great responsibility”.

Peace ✌️

I am an UI designer with a flair for front-end development that makes any brand shine at what they do best. I am right now building amazing products for our clients both Indian and International at Interactive Digital Labs. I am part of the Design and Marketing Teams for Make WordPress and has spoken at local camps on Gutenberg as well as the importance of user experience. I am not intimidated by markup, languages, or tools: HTML to CSS, wireframing to prototyping, JavaScript to agile development, and design programs including Sketch, Adobe XD, Figma, Photoshop, Illustrator, InDesign etc. I love languages, and not just programming either. I speak English, Hindi, Marathi, and Gujarati. When I am not taking courses to improve my skills, I am trying new food, dabbling in filmmaking and photography, and running and cycling. Say hi to me on Twitter here @jaymanpandya.

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.