ZL
About Articles Contact
Published on Jul 1, 2020
Filed under:
#javascript

Arrow Function Best Practices

When this is used in an arrow function, this will be the this value in the surrounding lexical scope.

Arrow functions change MANY things, so there are two best practices you need to know.

  1. Don’t create methods with arrow functions
  2. Create functions INISDE methods with arrow functions
Note

This article is an excerpt from Learn JavaScript. Check it out if you found this article helpful.

Before you read this

If you’re confused about the this keyword, try reading this article. It can help your clear up some confusions regarding this.

Practice #1: Don’t create methods with arrow functions

When you use Object Oriented Programming, you may need to call a method from another method. To call a method from another method, you need this to point back to the instance (which called the method).

Example:

Let’s build a Human with a sayHi method. sayHi says Hi!, then proceeds to end the conversation by saying the person’s name.

We can use a getFullname method that returns the full name of the person inside sayHi.

function Human(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
Human.prototype.getFullname = function () {
return this.firstName + ' ' + this.lastName
}
Human.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.getFullName()}`)
}

An instance can use the sayHi method and you’d expect it to work. It works because this points back to the instance.

const zell = new Human('Zell', 'Liew')
zell.sayHi()
Zell says hi.

Watch what happens if you change sayHi to an arrow function.

Human.prototype.sayHi = _ => {
console.log(`Hi! My name is ${this.getFullName()}`)
}
// ...
zell.sayHi()
Error, this.getFullname is not a function.

…

Why?

In this case, this inside sayHi points to Window. Since Window doesn’t have a getFullName method, calling getFullName will result in an error.

this points to Window because Window is the lexical this value is Window. We can verify that this is Window by logging it.

Human.prototype.sayHi = _ => {
console.log(this)
console.log(`Hi! My name is ${this.getFullName()}`)
}
// ...
zell.sayHi()
This is windows.

In short: Do not use arrow functions to create methods!

Create functions INSIDE methods with arrow functions

this always points to Window when it is used in a simple function. The statement is true even if you create a simple function inside a method.

const object = {
this() {
function sayThis() {
console.log(this)
}
sayThis()
},
}
object.this()
This is Window.

We usually want this to be the object when we use this inside a method. (So we can call other methods).

One way is to assign this to another variable. We often call this variable self or that. We’ll then use self or that inside the function.

const object = {
this() {
const self = this
function sayThis() {
console.log(self)
}
sayThis()
},
}
object.this()
This is the object.

Another way is to create a new function with bind.

const object = {
this() {
function sayThis() {
console.log(this)
}
const correctSayThis = sayThis.bind(this)
correctSayThis()
},
}
object.this()
This is the object.

If you use arrow functions, you don’t need to use self, that, or bind. You can write the arrow function directly, and this will point to the object (because the surrounding this value is the object).

const object = {
hello() {
const sayThis = _ => {
console.log(this)
}
sayThis()
},
}
object.hello()
This is the object.
Previous Testing JavaScript Performance Next What's the difference between an Interface and an API?

Join My Newsletter

I share what I’m learning on this newsletter: code, building businesses, and living well.

Sometimes I write about technical deep-dives, product updates, musings on how to live, and sometimes my struggles and how I’m breaking through.

Regardless of the type of content, I do my best to send you an update every week.

If you’re into making things and growing as a person, you’ll probably feel at home here.

“

Zell is the rare sort of developer who both knows his stuff and can explain even the most technical jargon in approachable — and even fun — ways!

I’ve taken his courses and always look forward to his writing because I know I’ll walk away with something that makes me a better front-ender.

Geoff Graham
Geoff Graham — Chief Editor @ CSS Tricks
The Footer

General

Home About Contact Testimonials Tools I Use

Projects

Magical Dev School Splendid Labz

Socials

Youtube Instagram Tiktok Github Bluesky X

Follow Along

Email RSS
© 2013 - 2025 Zell Liew / All rights reserved / Terms