In javascript this keyword can have different values in non-strict and strict mode. The value of this depends in which context it appears like, function, global, class
First we'll explore this in function context
function whatsThis() {
  return this;
}
console.log(whatsThis() === globalThis);// true
const detailObj = {
  name: 'vishwa'
};
detailObj.whatsThis = whatsThis;
console.log(detailObj.whatsThis() === detailObj); // true
the value of this depends on how function is called, In first console whatsThis is accessed on globalThis so the value of this is globalThis, In second console whatsThis is accessed on detailObj so the value of this is detailObj.
So the value of this is the object that is used to call the function.
In strict mode if function is accessed on globalThis the value of this is undefined.
function whatsThis() {
  'use strict'
  return this;
}
console.log(whatsThis() === undefined);// true
Arrow functions:
In arrow functions this retains the value of it's enclosing lexical context this, arrow functions create the closure over the this value of it's surrounding scope. so no matter how function is invoked the value of this is same what it was when the function was created.
const arrowFunc = () => this;
console.log(arrowFunc() === globalThis);
const obj = {
  name: 'vishwa'
};
console.log(arrowFunc.call(obj) === globalThis); //true 
Constructors:
when a functions is used as a constructor it's this is bound to the new object created. The value of this becomes the value of the new expression unless the constructor returns another non-primitive value.
function getInfo() {
  this.name = 'vishwa';
  this.job = 'coding';
}
const detail = new getInfo();
console.log(detail); //{"name": "vishwa",  "job": "coding"}
function getInfo2() {
  this.name = 'vishwa';
  return {id: 100};
}
const detail2 = new getInfo2();
console.log(detail2); //{"id": 100}
Class:
Class constructors are always called with new, so their behaviour is same as function constructors.
class Detail{
    constructor() {
        this.name = 'vishwa';
        this.job = 'coding';
    }
}
const detail = new Detail();
console.log(detail); // {name: 'vishwa', job: 'coding'}
bind method
Calling bind on function f, creates a new function with the same body as function f, but the value of this is bound to the first argument of bind.
function f() {
  return this.a;
}
const obj = {
  a: 'pop'
};
const binded = f.bind(obj);
console.log(binded()); // 'pop'
this in DOM event handlers:
When a function is used as a eventlistener it's this value is bound to the element on which eventlistenter is placed
    
Top comments (0)