Назад к вопросам
Middle
125
questionbank
Расскажи о контексте функций в JavaScript.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Контекст выполнения функции (this) в JavaScript определяет, как функция вызывается и какие значения доступны внутри нее. Контекст динамически изменяется в зависимости от способа вызова:
- Глобальный контекст: Вне функций,
thisссылается на глобальный объект (windowв браузере,globalв Node.js).// В браузере console.log(this === window); // true // В Node.js console.log(this === global); // true - Контекст функции:
- Стандартный вызов: В нестрогом режиме
thisвнутри функции ссылается на глобальный объект (если функция не метод объекта). В строгом режиме ("use strict";)thisбудетundefined.function showThis() { console.log(this); } showThis(); // В нестрогом: Global object; В строгом: undefined - Вызов как метод объекта:
thisссылается на объект, частью которого является метод.const user = { name: 'Alice', greet: function() { console.log("Hello, my name is " + this.name); } }; user.greet(); // Hello, my name is Alice - Вызов с
new(конструктор): Создает новый объект, который становится значениемthisвнутри функции-конструктора, и возвращает этот объект.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Явное указание контекста (
call,apply,bind):call(thisArg, arg1, arg2, ...): Вызывает функцию с указаннымthisи аргументами, перечисленными по отдельности.apply(thisArg, [argsArray]): Вызывает функцию с указаннымthisи аргументами в виде массива.bind(thisArg, arg1, arg2, ...): Возвращает новую функцию, у которойthisнавсегда привязан кthisArgи привязанным аргументам.
function introduce(greeting, punctuation) { console.log(greeting + ", I am " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Hi", "!"); // Hi, I am Charlie! introduce.apply(person, ["Hello", "."]); // Hello, I am Charlie. const boundIntroduce = introduce.bind(person, "Hey"); boundIntroduce("?"); // Hey, I am Charlie?
- Стандартный вызов: В нестрогом режиме
- Стрелочные функции: Не имеют собственного контекста
this. Они захватываютthisиз объемлющей лексической области видимости (той, в которой они были определены).const obj = { name: 'David', sayLater: function() { // this здесь ссылается на obj setTimeout(() => { // this здесь также ссылается на obj (унаследован из sayLater) console.log("Later, I am " + this.name); }, 1000); } }; obj.sayLater(); // Later, I am David