- To access the object, a method can use the
this
keyword.
- The value of
this
is the object “before dot”, or simply the one that call the method.
let user = {
name: "John",
age: 30,
sayHi() {
alert(this.name);
}
};
user.sayHi(); // John
- Technically, it’s also possible to access the object without this, by referencing it via the outer variable, but such code is unreliable as the reference name may change.
- In JavaScript, “
this
” keyword behaves unlike most other programming languages.
- First, it can be used in any function.
- The value of the following
this
is evaluated during the run-time and it can be anything.
function sayHi() {
console.log(this.name);
}
- Actually, we can call the function without an object at all.
- In the following case,
this
is undefined
in strict mode.
- If we try to access
this.name
, there will be an error.
- In non-strict mode, the value of
this
in such case will be the global object (window
in a browser).
- This is a historical behavior that
"use strict"
fixes.
- Usually a call of a function that uses
this
without an object is not normal, but rather a programming mistake.
- If a function has
this
, then it is usually meant to be called in the context of an object.
function sayHi() {
alert(this);
}
sayHi(); // undefined
this
and Reference Type
- An intricate method call can lose
this
reference.
let user = {
name: "John",
hi() { console.log(this.name); },
bye() { console.log("Bye"); }
};
user.hi(); // John
const targetMethod = (user.name === "John" ? user.hi : user.bye);
targetMethod(); // Undefined, because the context the method call is undefined.
- To make
user.hi()
or targetMethod()
calls work, JavaScript uses a trick:
- The
.
returns not a function, but a value of the special Reference Type.
- The Reference Type is a “specification type”, so we can’t explicitly use it, but it is used internally by the language.
- It is a three-value combination
(base, name, strict)
, where:
base
is the object.
name
is the property.
strict
is true if use strict
is in effect.
- Therefore, the result of a property access
user.hi
is not a function, but a value of Reference Type.
- When parentheses
()
are called on the Reference Type, they receive the full information about the object and its method.
Arrow Functions Have No “this
”
- Arrow functions are special: they don’t have their “own”
this
.
- If we reference
this
from such a function, it’s taken from the outer “normal” function.