How to access this inside callback in JavaScript ? How to access this inside forEach in JavaScript ?

Access this inside callback

There are couple of ways to access this inside a callback function. Let’s first write some code which makes use of callbacks. I’m going to use forEach method to iterate over an array.

function DataModule(){
	this.multiplier= 2;
  
	this.alterData = function(dataArr){
	  	dataArr.forEach(function(data, index){
	    	dataArr[index] = data * 2;
	    })
	    return dataArr;
	  }
}

let obj = new DataModule();
console.log(obj.alterData([1,2,3]));

// output -   [2, 4, 6]

Now let’s use the multiplier from this using variable multiplier.

function DataModule(){
	this.times = 2;
  
	this.alterData = function(dataArr){
	  	dataArr.forEach(function(data, index){
	    	dataArr[index] = data * this.times;
	    })
	    return dataArr;
	  }
}

let obj = new DataModule();
console.log(obj.alterData([1,2,3]));

// Outputs : -  [NaN, NaN, NaN]

This happens because this.times is undefined inside the callback method.

Access this Using Arrow function

You can access the this context inside the forEach using arrow functions. Modify the code as shown:

function DataModule(){
	this.times = 2;
  
	this.alterData = function(dataArr){
	  	dataArr.forEach((data, index) => {
	    	dataArr[index] = data * this.times;
	    })
	    return dataArr;
	  }
}

let obj = new DataModule();
console.log(obj.alterData([1,2,3]));

//   [2, 4, 6]

Access this Using bind

You can also use bind method to bind the context to the callback function.

function DataModule(){
	this.times = 2;
  
	this.alterData = function(dataArr){
	  	dataArr.forEach(function(data, index){
	    	dataArr[index] = data * this.times;
	    }.bind(this))
	    return dataArr;
	  }
}

let obj = new DataModule();
console.log(obj.alterData([1,2,3]));

Passing this to forEach method

forEach method provides an optional parameter to pass the scope.

function DataModule(){
	this.times = 2;
  
	this.alterData = function(dataArr){
	  	dataArr.forEach(function(data, index){
	    	dataArr[index] = data * this.times;
	    },this);
	    return dataArr;
	  }
}

let obj = new DataModule();
console.log(obj.alterData([1,2,3]));