Почему this равен window, а this.name выводит другое значение в JavaScript
Что проверяют
Знаете ли вы, что глобальный объект не пустой мешок, а объект со своими встроенными свойствами. Вопрос с подвохом: человек ждёт undefined, а получает строку, и по реакции видно, представляет он себе window или просто заучил правило про контекст.
Как отвечать
Ответ распадается на две независимые части.
Первая: обычный вызов функции в нестрогом режиме подставляет глобальный объект, поэтому this === window действительно истина.
Вторая: window.name существует всегда. Это стандартное свойство окна, имя контекста просмотра, которое используют атрибут target у ссылок и window.open. Тип у него всегда строковый, значение по умолчанию пустая строка, а присвоенное число превратится в строку.
function who() { console.log(this === window, this.name); }
who(); // true, ""
window.name = 7;
who(); // true, "7"Другие источники неожиданного значения там же: var name = "x" на верхнем уровне классического скрипта пишет в то же самое свойство, а функция-конструктор, вызванная без new, раскладывает свои поля прямо в window.
Хорошо закрыть ответ уточнением: в строгом режиме и в модулях this при таком вызове равен undefined, а глобальный объект правильнее звать globalThis, он одинаково работает и в браузере, и в Node.
Где спотыкаются
Считают, что this.name вернёт имя функции. Имя лежит в свойстве самой функции, f.name, а this.name читается с объекта вызова, и совпадение названий тут чистая ловушка.
Хранят состояние прямо на глобальном объекте и ловят молчаливые конфликты: name, length, top, self, status, origin уже заняты, а элементы страницы с атрибутом id добавляют туда же свои имена.
Переносят вывод на модули. В модуле this верхнего уровня равен undefined, а var не создаёт свойства глобального объекта, поэтому весь наблюдаемый эффект исчезает вместе со сменой типа скрипта.