12 часов назад я опубликовала пост в вопросом "Как будет называться тема следующего урока" и первым на оба вопроса правильно ответил @aim. Сегодня темой урока будет специальное значение undefined
.
Именно этот результат вы могли увидеть в консоли, запустив первый вариант кода:
var user; //объявляем переменную user
console.log(user); //вывести переменную user в консоли
var user = 'qqc'; //присвоить переменной user значение 'qqc'
Давайте начнем по порядку. Запуская веб-приложение, как мы уже говорили в предыдущих уроках, движок JavaScript создает оболочку, так называемое глобальное окружение, в котором находятся глобальный объект, переменная this
, внешнее окружение и ВАШ КОД. В момент создания этого контекста выполнения, когда парсер бежит по вашему коду, он считывает то, что вы написали для трансляции. Он распознает, КАКИЕ переменные вы объявили и ГДЕ создали функции, "настраивает" память для переменных и функций. Эта "настройка" называется "поднятием" переменных (Hoisting).
JavaScript, прежде чем начнет выполнять ваш код строчку за строчкой, резервирует для каждой вашей переменной и функции местечко в памяти. Получается, они уже существуют в памяти. И когда код начинает выполнятся, доступ к ним уже есть.
Когда движок JS оставляет место в памяти для переменной, он ещё не знает, чему она будет равна в конце концов, когда код будет выполнен. И он присваивает ей значение undefined
, что означает да, эта переменная существует, для нее "забито" местечко, но пока что я не знаю, чему она равна
. То есть undefined
- это такая затычка, значение по умолчанию.
Что касается второго варианта:
var user; //объявляем переменную user
var user = 'qqc'; //присвоить переменной user значение 'qqc'
console.log(user); //вывести переменную user в консоли
Здесь у нас уже вывелось значение переменной. Потому что код выполняется строчка за строчкой, соответственно к моменту вывода значения переменной user
, ей уже было присвоено значение 'qqc'
.
Ну а в третьем варианте, где переменная не была объявлена вовсе:
console.log(user); //вывести переменную user в консоли
должна была появиться ошибка:
Uncaught ReferenceError: user is not defined
user is not defined
и undefined
- вроде бы одно и то же, но в первом случае ошибка означает, что такая переменная вообще не была объявлена и её не существует, во втором случае, что её значение пока неизвестно.
Давайте посмотрим, как поведут себя функции:
function hello() {
console.log("Функция выполняется!"); //Выводим в консоль сообщение
}
hello(); //вызываем функцию
Если мы запустим веб-приложение с этим кодом, то в консоли увидим сообщение "Функция выполняется!"
. Что будет, если мы вызовем функцию до ее создания?
hello(); //вызываем функцию
function hello() {
console.log("Функция выполняется!"); //выводим в консоль сообщение
}
Всё равно увидим, что функция выполняется. Почему? Потому что во время "поднятия" движок посмотрит, какую функцию вы создали, и где она расположена, и, когда код начнет выполняться, уже будет известно куда "бежать" смотреть инструкции.
Голосуйте за моего делегата здесь. Для этого нужно нажать на стрелочку рядом с моим ником qqc
. Спасибо за поддержку! 🙏🌸
Сори, но как то не очень. Не рассказано, что undefined это тип данных ,а не просто специальное значение. NaN это специальное значение типа number, а undefined - это отдельный тип данных с единственным значением, которое тоже называется undefined.
Не рассказано о приведении типов с undefined. (undefined + '1' == 'undefined1', undefined + 1 == NaN)
Да ещё много всего есть, если говорить о undefined
Там еще есть const и let в ES6 они вообще ведут себя по другому. Я уже не говорю о стрелочных функциях. Но мне кажется что автор вполне понятно написал для начинающих. А если мы знаем больше, то я например готов написать курс по ES6.. :)
Спасибо за замечание. Впереди ещё много уроков, в которых обязательно будет ещё больше информации о типах данных, других специальных значениях и и т.д.
Это всего лишь третий урок 😉
И еще маленький вопрос, стоит ли почаще давать подобные задания, как это было сегодня?