JavaScript Arrow Functions

Arrow functions offer a shorter syntax for writing functions and handle the this keyword differently from regular functions.

A Shorter Way to Write Functions

Introduced in modern JavaScript, arrow functions provide a compact syntax for function expressions. You drop the function keyword and place an arrow between the parameter list and the body. They are especially popular for short callbacks passed to array methods, timers, and event handlers, where the shorter form keeps code readable.

From regular function to arrow function

<!DOCTYPE html>
<html>
<body>

<h2>From regular function to arrow function</h2>

<script>
// Regular function expression
const double1 = function (n) {
  return n * 2;
};

// Same thing as an arrow function
const double2 = (n) => {
  return n * 2;
};

console.log(double1(4), double2(4)); // 8 8
</script>

</body>
</html>

Implicit Return and Single Parameters

When the body is a single expression, you can omit the braces and the return keyword. The expression's value is returned automatically. If there is exactly one parameter, the parentheses around it are optional. To return an object literal implicitly, wrap it in parentheses so the braces are not mistaken for a function body.

Concise arrow forms

<!DOCTYPE html>
<html>
<body>

<h2>Concise arrow forms</h2>

<script>
const square = n => n * n;            // implicit return, no parens needed
console.log(square(5)); // 25

const greet = () => "Hello";          // no parameters need empty parens
console.log(greet()); // "Hello"

const makeUser = name => ({ name });  // parens to return an object
console.log(makeUser("Sam")); // { name: "Sam" }
</script>

</body>
</html>
Note: Arrow functions shine as short callbacks. For example, [1, 2, 3].map(x => x * 10) is far tidier than passing a full function expression.

Arrow Functions and this

The biggest behavioral difference is the this keyword. A regular function gets its own this depending on how it is called, which often causes confusion inside callbacks. An arrow function does not create its own this. Instead it uses the this from the surrounding code where it was defined. This lexical this makes arrows ideal for callbacks that need to reach the enclosing object.

Lexical this inside a method

<!DOCTYPE html>
<html>
<body>

<h2>Lexical this inside a method</h2>

<script>
const counter = {
  count: 0,
  start() {
    // Arrow keeps 'this' bound to counter
    setInterval(() => {
      this.count++;
      console.log(this.count);
    }, 1000);
  }
};

// A regular function here would set 'this' to the timer,
// not to counter, and this.count would be undefined.
counter.start();
</script>

</body>
</html>

When Not to Use Arrow Functions

  • Object methods that rely on this to reference the object itself.
  • Constructor functions: arrows cannot be called with new.
  • Functions that need the arguments object (arrows do not have one; use rest parameters instead).
  • Event handlers where you want this to be the element that fired the event.

Regular vs Arrow at a Glance

FeatureRegular functionArrow function
Own this bindingYesNo (uses surrounding this)
Can be a constructor (new)YesNo
Has arguments objectYesNo
Hoisted as declarationYesNo (expression only)
Concise single-expression bodyNoYes
Note: Because arrows have no this of their own, defining an object method as an arrow usually breaks it: this will not point to the object. Use a regular method for that case.