Добро пожаловать в четвертую часть серии YDKJS. Вы можете найти часть 3 здесь. Как было сказано в первой части, эта серия основана на моих уроках из легендарной серии книг Вы не знаете JS Кайла Симпсона и серии Javascript Каушика Котагула из Javabrains. .

Сначала мы рассмотрим еще несколько примеров запуска интерпретатора компилятора.
Давайте посмотрим на первый пример.

Теперь шаг компилятора должен быть очевиден. Он находит объявление переменной и объявление функции и помещает их в область, в которой они появляются.
Теперь, когда интерпретатор запускается, он переходит к строке 1, находит в компиляторе в глобальной области видимости и присваивает ему значение 10. Затем он находит следующее выполнение в строке 14 и находит функцию external в глобальной области видимости компилятора.
Теперь она переходит внутрь функции external и проверяет b. Находит b во внешней области видимости и присваивает ей значение a, которое она получает из глобальной области видимости от компилятора. В следующей строке 5 выводится значение b, т. Е. 10.

Затем интерпретатор выполняет строку 11 и находит ее во внешней области видимости компилятора. Затем он входит в него, и в строке 7 спрашивает компилятор, что у него есть переменная с именем b, и да, она есть, поэтому присвойте значение 20 для b. Затем он находит c также во внутренней области видимости и в строке 9 выводит значение c как 20.
Итак, когда мы выполняем его, печатается нижеприведенное.

Теперь вы можете подумать, что для 10 и 20 совершенно очевидно, что вывести печать, так зачем проходить этапы компилятора и интерпретатора. Давайте немного изменим приведенный выше пример, и тогда мы посмотрим, что будет печататься на консоли.

Теперь, когда мы проходим этап компиляции, он похож на предыдущий пример даже для b во внутренней области видимости. Во внутренней области видимости есть b, так как это переменная, найденная компилятором.

Теперь, когда интерпретатор подходит к строке 7, он спрашивает компилятор, есть ли у него переменная c во внутренней области видимости, и получает ее. Затем он спрашивает компилятор, где у него есть переменная b во внутренней области видимости, и компилятор говорит да. Затем интерпретатор переходит к строке 8 и консистирует значение c, которое будет undefined, поскольку оно еще не получило значения b.

Вот почему иногда необходимо пройти этап компилятора и интерпретатора один раз.

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

Эта концепция известна только как Подъем в Javascript.

Хостинг означает, что когда компилятор запускается и находит все объявления var, он как бы перемещает их в начало файла.

Давайте рассмотрим этот простой пример. Здесь мы выполняем операции с элементами a, b и c, не объявляя их предварительно. Они объявлены в строках 5, 6, 7, но интерпретатор не выдает ошибку времени выполнения. Это потому, что не имеет значения, где объявлены переменные. Они всегда поднимаются наверх, когда компилятор делает первый проход.

Это также верно для объявления функции, поскольку из наших предыдущих знаний мы знаем, что компилятор также обрабатывает объявление функции как объявление переменной, поскольку в JS все объявления функций являются объявлением объектов.

Но то же самое нельзя сказать о функциональных выражениях. Давайте посмотрим на пример ниже.

Здесь, когда компилятор запускается, он регистрирует переменную myFunc в строке 3, но не знает, что это такое. Итак, когда интерпретатор запускается в строке 1, он выдает ошибку времени выполнения, потому что он не знает, что такое myFunc.

Таким образом, функциональные выражения могут быть запущены только в том случае, если мы вызываем их после определения, так что у нас есть как компилятор, так и этап интерпретатора.

Некоторое сумасшедшее поведение javascript, например, мы можем присвоить значение необъявленной переменной, нежелательно для многих разработчиков. Мы можем ограничить то же самое, используя строгий режим, представленный в Ecma Script 5.

Рассмотрим приведенный ниже пример, в котором мы объявляем переменную myName. И где-то в нашей программе мы неправильно пишем myname и присваиваем значение. Итак, JS создает новую переменную myname и присваивает ей Набенду. Ясно, что не то, чего мы желаем.

Итак, мы используем строгий режим, написав «use strict» вверху программы. А теперь, если мы запустим программу, она выдаст ошибку во время выполнения.

На этом мы завершаем эту часть серии. Получите заключительную часть закрытия здесь.