Link Search Menu Expand Document

Контекст вызова. This

Обычная функция

Если обычная функция: this = window, если ‘use strict’ – undefined:

'use strict';
function showThis(){
    console.log(this);
}
showThis();

Объект

Контекст у методов объекта – сам объект

const obj = {
    a: 20,
    b: 15,
    sum: function () {
        console.log(this);
    }
};
obj.sum();

Функции-конструкторы и классы

this в конструкторах и классах – это новый экземпляр объекта

function User(name, id) {
    this.name = name;
    this.id = id;
    this.human = true;
}
let ivan = new User('Ivan', 23);

Передача контекста в функцию

function sayName(surname) {
    console.log(this);
    console.log(this.name + surname);
}

const user = {
    name: 'John'
};

sayName.call(user, 'Smith');
sayName.apply(user, ['Smith']);

Функции call и apply позволяют передать контекст вызова в функцию. Функцию одинаковы, разниуа только в синтаксисе передачи переменных в вызываемую функцию.

function count(num) {
    return this * num;
}
const double = count.bind(2);
console.log(double(3));
console.log(double(13));

При помощи функции bind мы можем создавать новую функцию с привязанным контекстом this

Контекст вызова в стрелочных функциях

Стрелочные функции не имеют собственного контекста вызова. Их контекстом является контекст родительского объекта.

const obj = {
    num: 5,
    sayNumber: function () {
        const say = () => {
            console.log(this);
        };
        say();
    }
};
obj.sayNumber();
{ num: 5, sayNumber: [Function: sayNumber] }

Если действие в стрелочной функции умещается в одну строчку, то можно применить укороченный вариант записи стрелочной функции.

Такая запись:

const double = (a) => {
    return a * 2;
};

Будет эквивалентна

const double = (a) => a * 2;

И если у функции только один аргумент, то она может быть записана без круглых скобок:

const double = a => a * 2;