Можно любить JavaScript, если он действительно его понимает :)

Нужно четко понимать, как на самом деле работает JavaScript за кулисами. Все, что происходит внутри кода JavaScript, происходит в контексте выполнения. Поэтому всякий раз, когда мы запускаем программу JavaScript, создается контекст выполнения. Он создается в два этапа:

  1. Этап создания памяти: на этом этапе движок JavaScript резервирует память для каждой переменной, а также функции, которые присутствуют в глобальной области видимости. Эта память также известна как переменная среда. Для переменных он присваивает значение undefined, а для функций копирует весь блок кода в память.
  2. Фаза выполнения кода: каждый код выполняется построчно. Если он видит переменную, он присваивает ей значение, а если видит функцию, то создает совершенно новый контекст выполнения!!

Давайте разберемся в этом на живом примере:

Если я ставлю точку останова на строку номер 1, она присваивает значение undefined переменной n, указывая на фазу создания памяти.

Теперь, если компилятор видит только код функции, он просто проходит через него. Функция не выполняется, если она не вызывается. Если я попытаюсь поставить точку останова в строке номер 4 только для проверки области, она покажет две области, локальную и глобальную. В локальной области есть две переменные ans и num со значениями внутри них. Вы также можете проверить стек вызовов, где куб находится поверх глобальной области видимости (анонимно). Стек вызовов определяет порядок выполнения. Он работает в формате «последним пришел — первым ушел» (LIFO). Как только движки встречают вызов функции, они помещают его на вершину стека.

Как только функция выполняет свой код, она выталкивается из стека и также удаляется из локального пространства.

Так работает стек выполнения в JavaScript.

Теперь мы можем продолжить изучение подъема.

Подъем в JavaScript

В большинстве языков программирования, если вы попытаетесь получить доступ к функции или переменной до того, как они будут определены, это вызовет ошибку. Но, как мы узнали выше, контекст выполнения работает в два этапа: мы можем получить доступ к определению функции или переменной до того, как они будут определены. Позвольте мне показать пример:

Для следующего кода

вывод, который мы получаем, следующий:

Если мы пытаемся получить доступ к переменной и функции до ее определения, это дает undefined для переменной и полное определение функции для функции. Это то, что ожидается от этапа создания памяти. Это то, что в JavaScript называется подъемом переменных и функций.

Из документов MDN определение подъема следующее:

Подъем в JavaScript – это процесс, при котором интерпретатор перемещает объявление функций, переменных или классов в верхнюю часть их области видимости перед выполнением кода.

Подъем позволяет безопасно использовать функции в коде до их объявления.

объявления переменных и классов также поднимаются, поэтому на них также можно ссылаться до их объявления. Обратите внимание, что это может привести к неожиданным ошибкам и обычно не рекомендуется.

Область видимости в JavaScript

По словам Кайла Симпсона:

«Область действия» — это набор правил, определяющих, как движок может искать переменную по ее имени-идентификатору и находить ее либо в текущей области, либо в любой из вложенных областей, в которых она содержится.

Проще говоря, область действия — это место, где вы можете получить доступ к определенной переменной или функции в программе. Чтобы понять это, мы должны быть свободны от некоторых предопределенных объектов в JavaScript. Объект Window создается при запуске файла JavaScript. Он имеет множество функций и переменных, которые вы можете найти в парах ключ-значение. Движок JavaScript также создает объект this. На глобальном уровне это===окно возвращает значение true.

Сфера бывает нескольких видов:

  1. Глобальная область: все, что не находится внутри функции, является глобальной областью. Все, что находится внутри глобальной области видимости, может быть объявлено в любом месте кода.
  2. Область действия блока: введенное в ES6, все, что находится внутри фигурных скобок, является блоком. Переменные, объявленные внутри блока, не могут быть объявлены снаружи блока.
  3. Функциональная область: Функция в JavaScript создает область.

Я буду добавлять новые статьи о JavaScript. Пожалуйста, напишите свои комментарии о том, как вам это понравилось. Спасибо :)