When we use an anonymous function inside a class, the variable ‘this’ will be reported as undefined as in the following example:
const department ={ employees:['Laura','Robert','Kevin'], manager: 'John', summary: function(){ return this.employees.map(function(employee){ return `${employee} reports to ${this.manager}`; }); } }; console.log(department.summary()); // Cannot read property manager of undefined
Option 1: Using function.bind(this)
In the highlighted line, we provide binding of ‘this’ to the anonymous function:
const department ={ employees:['Laura','Robert','Kevin'], manager: 'John', summary: function(){ return this.employees.map(function(employee){ return `${employee} reports to ${this.manager}`; }.bind(this)); } }; console.log(department.summary());
Option 2: Assigning ‘this’ to a variable within the scope of the anonymous function
In this case ‘this’ is assigned to a variable self and the anonymous function refers to self.manager instead of this.manager:
const department2 ={ employees:['Laura','Robert','Kevin'], manager: 'John', summary: function(){ var self = this; return this.employees.map(function(employee){ return `${employee} reports to ${self.manager}`; }); } }; console.log(department2.summary());
Option 3: Using an arrow function
When you define the anonymous function using the arrow notation, an implicit binding will take place, which is equivallent to Option 1 above.
const department3 ={ employees:['Laura','Robert','Kevin'], manager: 'John', summary: function(){ return this.employees.map((employee)=>{ return `${employee} reports to ${this.manager}`; }); } }; console.log(department3.summary());