How “this” keyword works in JavaScript?

What is “this” keyword in JavaScript?

this is a special object in JavaScript. It is entirely dependent in which context a code is executed. this is a property of active execution context object.

activeExecutionContext = {
  VO: {VO1, VO2, ...}, // VO = variable object
  this: {} // speical object
};

The value of the keyword this varies baesd on the execution context. this keyword value is set when the program enters in the context.

“this” is immutable:

The value of the keyword this is immutable while the code is running in the context as this is not a variable.

var myschoolObj = {name: "Jefferson Smith"};
var myObj = {
    name: "Jef",
    getName: function () {
        this = myschoolObj; // Uncaught ReferenceError: Invalid left-hand side in assignment
        console.log(this.name);
    }
};
myObj.getName();

Basic of determining the value of “this”:

Lets consider the following example:

var name = "Joe Smith";
var myObj = {
    name: "Jennifer Smith",
    getName: function () {
        console.log(this.name);
    }
}
myObj.getName();             // Jennifer Smith
(newObj = myObj.getName)();  // Joe Smith

To understand why the same method prints two different names we need to get into the basics of the keyword this. In EcmaScript we have mechanism called References that are not visible to public. References are important to scripting language engine implementors.

References is an abstract entity that consists of three components — base, name, and strict flag. We will not consider strict flag for now. So the References can be presented using following pseudo-code:

var Reference = {
  base: ,
  propertyName: 
};

References are created for following two cases:

  • In the process of Identifier resolution // i.e. myObj creates a reference
  • During property access // i.e. myObj.getName creates a reference

How the Reference is related with the keyword “this”?

When a Reference is created the keyword this is set to base attribute value of Reference object.

Explanation of myObj.getName() with Reference

myObj.getName() creates a reference and following is the Reference object:

var getNameReference = {
  base: myObj,
  propertyName: 'getName'
};
// this == getNameReference.base == myObj

This is why the keyword this is set to myObj inside getName method.

Explanation of (newObj = myObj.getName)() with Reference

In this case myObj.getName gets assigned to newObj that transforms myObj.getName Reference into an actual function object.

Here is a good video about “this” in JavaScript: