> Как обращаться к объекту массива через this в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

Короткий ответ

this внутри метода массива (например, в forEach, map, filter) не ссылается на сам массив - он определяется контекстом вызова. Чтобы обратиться к массиву, используйте замыкание (имя переменной) или второй аргумент thisArg. В стрелочных функциях this берётся из внешнего лексического окружения, поэтому там тоже работает замыкание. Прямой доступ к массиву через this возможен только в методах самого массива, например, если вы расширяете Array.prototype.

Подробное объяснение

В JavaScript this определяется тем, как вызвана функция, а не где она объявлена. В методах перебора массива (forEach, map, filter, reduce и других) колбэк вызывается как обычная функция, поэтому this внутри него будет либо undefined в strict mode, либо глобальный объект в нестрогом режиме. Исключение - если колбэк передан как метод объекта: тогда this внутри колбэка будет ссылаться на этот объект, но не на массив.

Чтобы получить доступ к массиву внутри колбэка, есть несколько способов:

  1. Замыкание - самый распространённый вариант. Колбэк объявляется внутри функции, где доступна переменная массива, и использует её напрямую.
  2. thisArg - второй аргумент методов forEach, map, filter, some, every, find, findIndex. Он задаёт значение this внутри колбэка. Но это не массив, а произвольный объект - вы сами решаете, что туда передать.
  3. Стрелочные функции - они не имеют собственного this, поэтому this внутри них берётся из внешней функции. Если внешняя функция - метод объекта, то this будет объектом, но не массивом.

Если вы хотите, чтобы this внутри колбэка ссылался на сам массив, передайте массив как thisArg:

JAVASCRIPT
const arr = [1, 2, 3];
arr.forEach(function(item) {
console.log(this === arr); // true
}, arr);

Но на практике это редко нужно - проще использовать замыкание.

На практике

В реальном коде почти никто не использует thisArg для доступа к массиву. Основной паттерн - замыкание:

JAVASCRIPT
const numbers = [1, 2, 3];
const doubled = numbers.map(function(n) {
return n * numbers.length; // доступ через замыкание
});

Или со стрелочными функциями:

JAVASCRIPT
const numbers = [1, 2, 3];
const doubled = numbers.map(n => n * numbers.length);

Если вы расширяете Array.prototype собственным методом, то this внутри него будет ссылаться на массив - это стандартное поведение:

JAVASCRIPT
Array.prototype.myMethod = function() {
return this.length; // this - массив
};

Но расширение встроенных прототипов - плохая практика в production-коде, лучше избегать.

Пример кода

JAVASCRIPT
// Замыкание - рекомендованный способ
const arr = [10, 20, 30];
const result = arr.filter(function(item) {
return item > arr[0]; // arr доступен через замыкание
});
console.log(result); // [20, 30]
// thisArg - альтернатива, но редко используется
const arr2 = [1, 2, 3];
arr2.forEach(function(item) {
console.log(this === arr2); // true
}, arr2);
// Стрелочная функция - this из внешнего контекста
const obj = {
arr: [1, 2, 3],
process() {
return this.arr.map(item => item * this.arr.length); // this - obj
}
};
console.log(obj.process()); // [3, 6, 9]
// Метод на прототипе - this указывает на массив
Array.prototype.sum = function() {
return this.reduce((acc, val) => acc + val, 0);
};
console.log([1, 2, 3].sum()); // 6

Как отвечать на собеседовании

Начните с ключевого факта: this в колбэках методов массива не ссылается на массив автоматически. Объясните, как this определяется контекстом вызова, и упомяните разницу между обычными и стрелочными функциями. Затем покажите два основных способа доступа к массиву: замыкание и thisArg. Если спросят про Array.prototype - поясните, что там this действительно указывает на массив, но расширять прототипы не рекомендуется.

Говорите структурированно: сначала правило, потом исключения, потом практические рекомендации. Приведите короткий пример с замыканием и упомяните, что это стандартный подход в реальном коде.

Что проверяет интервьюер

Интервьюер проверяет понимание ключевого механизма JavaScript - динамического связывания this. Это базовый уровень senior-разработчика: вы должны не просто знать, что this "не работает", а объяснить почему, и предложить корректные альтернативы. Также проверяется знание методов массива и их сигнатур, включая неочевидный параметр thisArg. Важно показать, что вы понимаете разницу между обычной функцией и стрелочной в контексте this.

Типичные ошибки

  • Утверждение, что this внутри forEach или map ссылается на массив - это неверно.
  • Использование this в колбэке без thisArg в strict mode - получите undefined, а не массив.
  • Попытка использовать стрелочную функцию с thisArg - стрелочные функции игнорируют thisArg, так как не имеют собственного this.
  • Расширение Array.prototype без проверки на существование метода - может сломать код при дублировании.
  • Предложение использовать arguments.callee или другие устаревшие механизмы для доступа к массиву - это плохая практика.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью