@Allakazam

Почему не появляется ошибка ReferenceError?

Не так давно начал изучение JS. И только сейчас столкнулся с непонятной для меня ситуацией:
Код пишу в программе Sublime Text 3. Пример кода следующий
var name = 'MyName';
console.log(name);

Сохраняю этот код и проверяю в браузере - все работает отлично и в консоли отображается значение моей переменной.
После этого, я удаляю 1 строчку и сохраняю файл, остается только
console.log(name);
console.log(this);

В консоли нет ошибки, что переменная не определена, просто пустая строка.
Тоже самое происходит со всеми переменными, которые были определены с помощью ключевого слова var.
Если проделать тоже самое с помощью ключевых слов const и let - выдает ожидаемую ошибку ReferenceError.
Получается, что var как-то сохраняет переменную, и после удаления ее из кода, все равно остается, но с пустым значением?
5c39be67f1ed7732469666.jpeg
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
ChingizMuellim
@ChingizMuellim
FrontEnd, React Js
Дело в том, что ты себя путаешь. This это своего рода указатель для методов. (Метод это функция яв-ся свойством обьекта). В этом случае this (так как не в обьекте) напрвляется на глобальный обьект, а это window. У виндов наме как свойство существует, но пустое. Например, если ты напишешь это самое в https://codepen.io/pen, то у тебя name будет иметь значение CodePen. Конкретно в твое случае windows имеет name, но пустое. По этому не выводит ошибок. Надеюсь смог объяснить.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Machinez
@Machinez
var ничего и никуда не сохраняет, на скриншоте у тебя показано свойство name объекта Window, которое никакого в данном случае отношения к твоей переменной не имеет
https://developer.mozilla.org/en-US/docs/Web/API/W...
но при объявлении переменной name в глобальном контексте, ты перезаписываешь это свойство у объекта Window
Ответ написан
Комментировать
viewDidLoad
@viewDidLoad
Свойство name уже определено браузером и хранится в объекте window
Помимо собственно свойств окна, объект также хранит все глобальные переменные, которые попадают туда при объявлении через var в глобальной области, либо объявлении без ключевого слова в любом месте программы (без 'use strict')
Тем самым, объявляя в глобальной области переменную name через var, вы переопределяете одноименное свойство window.name
Определения же через let/const даже в глобальном контексте будут храниться отдельно от window
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы