Back to questions
Junior
89
questionbank
Как изменить контекст функции в JavaScript?
Sobes Copilot
Get answers in real time
Answer from AI
sobes.tech AI
В JavaScript контекст выполнения функции (значение this) можно изменить несколькими способами:
-
call(): Выполняет функцию с заданным значениемthisи аргументами, переданными по отдельности через запятую.// function.call(thisArg, arg1, arg2, ...) function greet(name) { console.log(`Hello, ${name}! I am ${this.type}`); } const obj = { type: 'object' }; greet.call(obj, 'Alice'); // Hello, Alice! I am object -
apply(): Выполняет функцию с заданным значениемthisи аргументами, переданными в виде массива или массивоподобного объекта.// function.apply(thisArg, [argsArray]) function sum(a, b) { console.log(`${this.name}: ${a + b}`); } const context = { name: 'Calculator' }; const numbers = [5, 10]; sum.apply(context, numbers); // Calculator: 15 -
bind(): Создает новую функцию, "привязанную" к заданному значениюthis. Оригинальная функция при этом не вызывается немедленно.// function.bind(thisArg, arg1, arg2, ...) const user = { name: 'Bob' }; function sayHello() { console.log(`My name is ${this.name}`); } const boundSayHello = sayHello.bind(user); boundSayHello(); // My name is Bob -
Стрелочные функции (
=>): Стрелочные функции не имеют собственного контекстаthis. Они захватываютthisиз лексического окружения (из обычного родительского scope, где они были определены).class MyClass { constructor() { this.value = 'class value'; // Стрелочная функция сохраняет контекст класса this.logValue = () => { console.log(this.value); }; } } const instance = new MyClass(); const method = instance.logValue; method(); // class value (контекст сохранен) // Сравните с обычной функцией без bind class AnotherClass { constructor() { this.value = 'another value'; this.logValue = function() { console.log(this.value); // 'this' будет window или undefined в строгом режиме }; } } const anotherInstance = new AnotherClass(); const anotherMethod = anotherInstance.logValue; anotherMethod(); // undefined (контекст потерян при вызове как отдельной функции)