

0 / 2 embers
0 / 3000 xp
click for more info
Complete a lesson to start your streak
click for more info
Difficulty: 4
click for more info
Not enough gems
Cost: 6 gems
1: Objects
incomplete
2: No Colon
incomplete
3: Updating Properties
incomplete
4: Nesting Properties
incomplete
5: Nesting Properties Quiz
incomplete
6: Optional Chaining
incomplete
7: When to Chain
incomplete
8: Object Methods
incomplete
9: Methods Mutate
incomplete
10: Initializing Props
incomplete
11: Strings As Keys
incomplete
12: This
incomplete
13: Arrow Functions
incomplete
14: Fat Arrows and This
incomplete
15: Spread Syntax
incomplete
16: Return Objects
incomplete
17: Destructuring
incomplete
18: Not Bound
incomplete
Back
ctrl+,
Next
ctrl+.
This lesson's interactive features are locked, please to keep using them
Methods in JavaScript are not bound to their object by default (as they are in languages like Python and Go). So if you use a method as a "callback" function, you may run into issues with the this keyword:
const user = {
name: "Lane",
sayHi() {
console.log(`Hi, my name is ${this.name}`);
},
};
user.sayHi();
// Hi, my name is Lane
const sayHi = user.sayHi;
sayHi();
// TypeError: Cannot read properties of undefined (reading 'name')
This happens a lot when passing a method as a callback function to another function:
const user = {
firstName: "Lane",
lastName: "Wagner",
getFullName() {
return `${this.firstName} ${this.lastName}`;
},
};
function getGreeting(introduction, nameCallback) {
return `${introduction}, ${nameCallback()}`;
}
console.log(user.getFullName());
// Lane Wagner
console.log(getGreeting("Hello", user.getFullName));
// TypeError: Cannot read properties of undefined (reading 'firstName')
If you want to use a method as a callback function, you'll need to bind it to the object using the bind method:
const boundGetFullName = user.getFullName.bind(user);
console.log(getGreeting("Hello", boundGetFullName));
Fix the bug on line 19 so that this correctly references the scope of the campaign object.