Bird
Raised Fist0
Javascriptprogramming~10 mins

this with arrow functions in Javascript - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - this with arrow functions
Start function
↓
Arrow function created
↓
Arrow function uses 'this' from surrounding context
↓
Call arrow function
↓
Access 'this' from outer scope
↓
Return or use 'this'
↓
End
Arrow functions do not have their own 'this'. They use 'this' from where they were created.
Execution Sample
Javascript
const obj = {
  name: 'Alice',
  greet: () => console.log(this.name)
};
obj.greet();
This code tries to print 'name' using an arrow function inside an object.
Execution Table
StepCode LineAction'this' valueOutput
1const obj = {...}Create object with name and greetGlobal or module scope
2greet: () => console.log(this.name)Define arrow function; 'this' is from outer scopeGlobal or module scope
3obj.greet()Call arrow functionGlobal or module scopeundefined
4console.log(this.name)Access 'this.name' in arrow functionGlobal or module scopeundefined
💡 'this' inside arrow function is not obj, but outer scope, so this.name is undefined
Variable Tracker
VariableStartAfter 1After 2After 3Final
objundefined{name: 'Alice', greet: [Function]}{name: 'Alice', greet: [Function]}{name: 'Alice', greet: [Function]}{name: 'Alice', greet: [Function]}
thisGlobal or module scopeGlobal or module scopeGlobal or module scopeGlobal or module scopeGlobal or module scope
Key Moments - 2 Insights
Why does 'this.name' inside the arrow function not refer to 'obj.name'?
Because arrow functions do not have their own 'this'. They use 'this' from where they were created, which is the outer/global scope here, not the object.
What would happen if we used a regular function instead of an arrow function for 'greet'?
A regular function's 'this' would refer to the object when called as obj.greet(), so 'this.name' would correctly be 'Alice'.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of 'this' inside the arrow function when obj.greet() is called?
AGlobal or module scope
BUndefined
CThe obj object
DThe greet function itself
💡 Hint
Check the 'this' value column in step 3 and 4 of the execution table.
At which step does the output 'undefined' occur?
AStep 4
BStep 3
CStep 2
DStep 1
💡 Hint
Look at the Output column in the execution table.
If we replace the arrow function with a regular function, how would the output change?
AOutput would be 'undefined' still
BOutput would be an error
COutput would be 'Alice'
DOutput would be an empty string
💡 Hint
Recall that regular functions have their own 'this' bound to the calling object.
Concept Snapshot
Arrow functions do NOT have their own 'this'.
They use 'this' from the surrounding code where they are created.
Inside objects, arrow functions do NOT bind 'this' to the object.
Use regular functions to access object 'this'.
Arrow functions are great for preserving outer 'this' in callbacks.
Full Transcript
This visual trace shows how 'this' behaves inside arrow functions in JavaScript. When an arrow function is created inside an object, it does not get its own 'this'. Instead, it uses 'this' from the outer scope, which is usually the global or module scope. So, when calling obj.greet(), the arrow function's 'this' is not the object, but the outer scope. This causes 'this.name' to be undefined. If we used a regular function instead, 'this' would refer to the object, and 'this.name' would be 'Alice'. This difference is important to understand when choosing between arrow functions and regular functions.

Practice

(1/5)
1.

What is true about this in arrow functions compared to regular functions?

easy
A. this in arrow functions is inherited from the surrounding code where they are created.
B. this in arrow functions always refers to the global object.
C. this in arrow functions is undefined.
D. this in arrow functions refers to the function itself.

Solution

  1. Step 1: Understand how this works in arrow functions

    Arrow functions do not have their own this. Instead, they use the this value from the surrounding (lexical) context where they are created.
  2. Step 2: Compare with other options

    Options B, C, and D are incorrect because arrow functions do not bind this to the global object, undefined, or themselves.
  3. Final Answer:

    this in arrow functions is inherited from the surrounding code where they are created. -> Option A
  4. Quick Check:

    this in arrow functions = lexical this [OK]
Hint: Arrow functions use surrounding this, not their own [OK]
Common Mistakes:
  • Thinking arrow functions have their own this
  • Confusing arrow functions with regular functions
  • Assuming this is always global in arrow functions
2.

Which of the following is the correct syntax to define an arrow function that logs this.name?

const obj = { name: 'Alice', logName: ??? }
easy
A. logName: function log() { console.log(this.name) }
B. logName: function() { console.log(this.name) }
C. logName: () { console.log(this.name) }
D. logName: () => console.log(this.name)

Solution

  1. Step 1: Identify arrow function syntax

    Arrow functions use the syntax () => expression or () => { statements }. logName: () => console.log(this.name) uses the correct concise syntax.
  2. Step 2: Check other options

    Options B and D use regular function() syntax, not arrow functions. logName: () { console.log(this.name) } () { console.log(this.name) } is missing the fat arrow =>, resulting in a syntax error. Note: even with correct arrow syntax as an object method, this would refer to the lexical scope (global), not the object.
  3. Final Answer:

    logName: () => console.log(this.name) -> Option D
  4. Quick Check:

    Arrow function syntax = logName: () => console.log(this.name) [OK]
Hint: Arrow function syntax: () => expression or () => { } [OK]
Common Mistakes:
  • Forgetting the fat arrow '=>'
  • Using function keyword instead of arrow syntax
  • Confusing arrow function with method shorthand
3.

What will be the output of this code?

const person = {
  name: 'Bob',
  greet: () => {
    console.log(this.name);
  }
};
person.greet();
medium
A. undefined
B. '' (empty string)
C. Error
D. Bob

Solution

  1. Step 1: Understand this in arrow functions inside objects

    The arrow function greet does not have its own this. It uses this from the surrounding scope, which is the global scope here.
  2. Step 2: Check global this.name

    In most environments, this.name in global scope is undefined unless explicitly set.
  3. Final Answer:

    undefined -> Option A
  4. Quick Check:

    Arrow function this = lexical this (global) [OK]
Hint: Arrow functions use outer this, not object [OK]
Common Mistakes:
  • Expecting this to be the object
  • Confusing arrow function with regular method
  • Assuming global this.name is set
4.

Find the error in this code and fix it so that this.name inside greet refers to the user object:

const user = {
  name: 'Carol',
  greet: () => {
    console.log(this.name);
  }
};
user.greet();
medium
A. Use function greet() { console.log(this.name); } outside the object
B. Add bind(user) to the arrow function
C. Change greet to a regular function: greet() { console.log(this.name); }
D. Replace this.name with user.name inside arrow function

Solution

  1. Step 1: Identify why this.name is incorrect

    Arrow functions do not have their own this, so inside greet, this is not the user object.
  2. Step 2: Fix by using a regular function method

    Defining greet as a regular function method binds this to the user object when called as user.greet().
  3. Final Answer:

    Change greet to a regular function: greet() { console.log(this.name); } -> Option C
  4. Quick Check:

    Use regular function for object methods needing this [OK]
Hint: Use regular functions for object methods needing this [OK]
Common Mistakes:
  • Trying to bind this to arrow functions
  • Using arrow functions for object methods expecting this
  • Accessing object properties via global this
5.

You want to create an object with a method that uses a callback to print the object's name property after 1 second. Which code correctly uses arrow functions to keep this referring to the object?

const obj = {
  name: 'Dave',
  printName: function() {
    setTimeout(??? , 1000);
  }
};
obj.printName();
hard
A. function() { console.log(this.name) }
B. () => console.log(this.name)
C. function() { console.log(obj.name) }
D. () => { console.log(obj.name) }

Solution

  1. Step 1: Understand this inside setTimeout callback

    Inside setTimeout, a regular function's this is global or undefined, so it loses the object context.
  2. Step 2: Use arrow function to inherit this from printName

    Using an arrow function as callback keeps this from printName, which is the object obj.
  3. Final Answer:

    () => console.log(this.name) -> Option B
  4. Quick Check:

    Arrow function callback keeps this from method [OK]
Hint: Use arrow function callbacks to keep this context [OK]
Common Mistakes:
  • Using regular function losing this context
  • Referencing object by name inside callback (less flexible)
  • Not using arrow function for callbacks needing this
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard