> Как обращаться к объекту массива через 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 внутри колбэка будет ссылаться на этот объект, но не на массив.
Чтобы получить доступ к массиву внутри колбэка, есть несколько способов:
- Замыкание - самый распространённый вариант. Колбэк объявляется внутри функции, где доступна переменная массива, и использует её напрямую.
thisArg- второй аргумент методовforEach,map,filter,some,every,find,findIndex. Он задаёт значениеthisвнутри колбэка. Но это не массив, а произвольный объект - вы сами решаете, что туда передать.- Стрелочные функции - они не имеют собственного
this, поэтомуthisвнутри них берётся из внешней функции. Если внешняя функция - метод объекта, тоthisбудет объектом, но не массивом.
Если вы хотите, чтобы this внутри колбэка ссылался на сам массив, передайте массив как thisArg:
JAVASCRIPTconst arr = [1, 2, 3];arr.forEach(function(item) {console.log(this === arr); // true}, arr);
Но на практике это редко нужно - проще использовать замыкание.
На практике
В реальном коде почти никто не использует thisArg для доступа к массиву. Основной паттерн - замыкание:
JAVASCRIPTconst numbers = [1, 2, 3];const doubled = numbers.map(function(n) {return n * numbers.length; // доступ через замыкание});
Или со стрелочными функциями:
JAVASCRIPTconst numbers = [1, 2, 3];const doubled = numbers.map(n => n * numbers.length);
Если вы расширяете Array.prototype собственным методом, то this внутри него будет ссылаться на массив - это стандартное поведение:
JAVASCRIPTArray.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или другие устаревшие механизмы для доступа к массиву - это плохая практика.
> Похожие задачи по frontend
Пример замыкания с внутренней функцией и предмет замыкания в JavaScript
Для чего нужен оператор nullish coalescing (??) и как он работает в JavaScript
Сколько времени занял рефакторинг и каков был объем работы
Как работают call stack, callback queue, event loop, микротаски и макротаски в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью