Якщо скрипт виконується не в суворому режимі, то this посилається на об'єкт window. В суворому режимі this, в глобальній області видимості, буде undefined.
"use strict";// Суворий чи не суворий режимfunctionmyFunc(){console.log(this);}myFunc();// window or undefined
Якщо функція є методом обʼєкта, то контекст посилатиметься на сам обʼєкт в якому і міститься цей метод.
constuser={name:"Alex",showName(){console.log("User name: ",this.name);},showThisObject(){console.log(this);},};user.showThisObject();//{name: 'Alex', showName: ƒ, showThisObject: ƒ}user.showName();//User name: Alex
Раніше ми визначили: контекст визначається місцем виклику функції, а не її створення.
Тому, якщо створити функцію у глобальній області - вона матиме глобальний контекст (window або undefined). А якщо цю функцію присвоїти як метод якомусь обʼєкту, то якщо викликати цей метод, як частину об'єкта - контекст посилатиметься на цей обʼєкт. Далі приклад:
Якщо метод об'єкта передають як колбек-функцію, то контекст не зберігається. Колбек - це посилання на метод, яке присвоюється як значення параметра, що викликається без об'єкта.
Стрілкові функції не мають власного this. На відміну від класичних функцій, змінити значення this всередині стрілкової функції після її оголошення - неможливо.
Контекст всередині стрілкової функції визначається місцем її оголошення, а не місцем виклику, і посилається на контекст батьківської функції.
Стрілкові функції ігнорують наявність суворого режиму. Якщо стрілка запам'ятала глобальний контекст, то this в ній буде містити посилання на window, незалежно від того, чи виконується скрипт в суворому режимі.
Обмежуючи стрілкові функції постійним контекстом, можна краще їх оптимізувати, на відміну від звичайних функцій, значення this яких можна змінити.
// Створюємо функцію у глобальній області видимості
function showContext() {
console.log(this);
}
// Виклик функції покаже контекст
showContext(); // window or undefined
// Створимо якийсь обʼєкт
const user = {
name: "Alex",
};
// Присвоїмо методу обʼєкту функцію з глобальної області видимості
user.showObjectContext = showContext;
// Контекст цієї функції вже буде обʼєкт user
user.showObjectContext(); // {name: 'Alex', showObjectContext: ƒ}
// Створюємо обʼєкт з методом, в якому є посилання на мам обʼєкт
const user = {
name: "Alex",
showName() {
console.log(this.name);
},
};
// Видно, що метод працює і повідомлення виводиться
user.showName(); // Alex
// Передамо метод у функцію як колбек
function myFunc(callback) {
callback();
}
// Викличемо функцію в яку передамо метод, як колбек
myFunc(user.showName); // Помилка бо у myFunc немає властивості name
// Створюємо стрілкову функцію у глобальній області видимості
const showContext = () => {
console.log(this);
};
// Виклик функції покаже контекст
showContext(); // window
// Створимо якийсь обʼєкт
const user = {
name: "Alex",
};
// Присвоїмо методу обʼєкту стрілкову функцію з глобальної області видимості
user.showObjectContext = showContext;
// Контекст цієї функції буде все той же, бо це стрілка
user.showObjectContext(); // window