Javascript can be a pretty illusive language. It gives you objects, but it is not what traditional object-oriented programming languages are like. It gives you arrays, but their typeof is not "array"
. With enough time spent learning and using Javascript, these nuances start to feel natural. But for anyone who is new to this programming language, things can get quite frustrating very fast. In Javascript, the keyword this
is quite different from how this same keyword behaves in other programming languages.
In this article, we will take a look at how the keyword this
behaves in Javascript in different contexts and in different modes.
Is This Window?
Given that you are in the environment of a web browser, this
refers to window
in the global context. window
in web browsers is the global object. This is true, regardless of the mode: strict or not.
|
|
In server-side environments, such as Node.js, this
refers to global
:
console.log(this === global) // true
Going Nuts With Functions
In non-strict mode, this
inside functions must always refer to some object. When a top-level function is called, this
refers to the global object:
|
|
The same function, when defined in strict mode, will have a different interpretation of this
:
|
|
Methods
But that’s not all. When functions are invoked as methods on objects, this
refers to the object themselves:
|
|
This shows that for the function thing.thisThat
, this
refers to thing
. By now, if you are thinking that this
is easy (pun intended) then you are in for a big surprise. Take a look at the following snippet:
|
|
In Javascript, this
is not at all affected by where the function was defined. It is all about the context and what object the function or method was called on.
Constructors
Now, slap a new
keyword in front of the function call, and this
becomes a new object.
|
|
Javascript constructors have a lot more going on behind the scene. You can learn more about them here.
With .bind
The method bind
available on all functions in Javascript that returns a new function for which this
is always some specific pre-defined object:
|
|
With .call or .apply
Similar to how bind
works, call
and apply
allows this
to be bound to some object but at invocation. Unlike bind
, call
and apply
invokes the function immediately with the given this
binding.
|
|
Both of these functions also allow arguments to be passed programmatically. You can learn more about them here.
Wrap Up
Javascript keyword this
may seem very confusing at first - and in many ways it is confusing to say the very least. However, in real use, this starts to make sense and as mentioned earlier becomes a natural and rather interesting way of dealing with contexts of functions. In this article we have looked at some of the common scenarios where the interpretation of this
varies, but there are more. In case you are struggling to understand how this keyword works, we recommend you open up some Javascript REPL (e.g. Node.js REPL or your web browser’s developer console) and start messing around with it.