×
By the end of this chapter, you should be able to:
this is and what a call-site isthis: default bindingthis?The keyword this is one of the more unique features of JavaScript. It often presents a stumbling block to people learning JavaScript, even if they already know some other language. However, the rules governing this are relatively straightforward once you've familiarized yourself with them.
At its core, this is just a keyword in JavaScript that refers to some object. For instance, if you hop into the Chrome console and type this, you'll see that it refers to the window. However, the value of the keyword this depends on where in your code you use it. Let's take a look at the different ways the value for the keyword this gets set.
The terms default binding, implicit binding, explicit binding, and new binding come from the incredible book You Don't Know JS by Kyle Simpson. You can read more about these terms in his book on prototypes and the keyword this here.
You can think of this as the last possible option when all other rules do not apply. The default binding exists when the keyword this is in the global context. As we've already seen, in the case of the browser the keyword this has a default binding to the window.
var thing = this; thing; // window function outer() { return this; } outer(); // window
For the other three bindings, the value of the keyword this is set to some value other than the default when it is used inside of a function. But the details of how the value gets set depend on the call-site of the function. The call-site is simply the way and location in which the function is called.
To prevent ourselves from creating variables in the global scope, we can add the text "use strict" to enable strict mode. This was created in ES5 to prevent developers from making mistakes and instead of silent errors, strict mode will throw errors. You can read more about it here.
If strict mode is enabled, the default binding of this is undefined.
"use strict" function outer() { return this; } outer(); // undefined function info(){ this.data = "something"; } info() // Uncaught TypeError: Cannot set property 'data' of undefined // this is happening since `this` is being set to undefined // and we can not access properties on undefined!
When you're ready, move on to Implicit Binding