Регистрация объявлений переменных и функций в Java Script

Я смотрел видео по областям javascript, в котором говорилось, что незадолго до того, как браузер интерпретирует код java-скрипта, он на самом деле включает в себя быстрый этап компиляции (ну, не совсем так называемый "компиляция", так как он не включает создание промежуточного файла), который регистрирует переменную и объявление функции в соответствующей области видимости. Так что, если я напишу:

var a = 3;
function foo(){
var c = 2;
}

Перед оценкой вышеприведенного выражения, которое означает игнорирование части RHS, переменная 'a' и функция 'foo' будут зарегистрированы в глобальной области видимости, а внутри области видимости 'foo' будет зарегистрирована переменная 'c'. После этого шага компиляции выражения будут оцениваться по их значениям.

Но что происходит, когда мы пишем:

var a = function(){
var c;
}

Будет ли этап компиляции просто зарегистрировать переменную 'a' в глобальной области видимости и пропустить объявление функции и объявление переменной 'c', поскольку предполагается, что шаг компиляции пропускает часть RHS, а вычисление выражений входит в часть интерпретатора?

1 ответ

Собственно, я понял это позже. Это Подъем. Подъем работает только для переменных и объявления функций, а не для выражения функций. Оказывается, что единственные временные функции в выражении функций и их локальные переменные регистрируются, когда интерпретатор сценариев Java запускается (после компиляции), поскольку этап компиляции не будет беспокоить их, поскольку они находятся в части RHS. Это гарантирует, что в случае выражения функции мы вызываем его только после его присваивания, и интерпретатор заботится о регистрации функции в глобальной области видимости, присваивая ее переменной LHS и объявлению ее локальной переменной (var bar;):

var foo = function() {
  console.log(bar);
  var bar = 5;
};
foo();

Этот функциональный объект создается только тогда, когда интерпретатор достигает этой строки:

var foo = function abc() {

Если бы это был случай объявления функции, что-то вроде этого:

foo();

function foo() {
  console.log(bar);
  var bar = 5;
}

Подъем помог бы убедиться, что на этапе компиляции он регистрирует функцию 'foo' и объявляет переменную 'bar' внутри своей области видимости.

Тем не менее, обе программы будут выдавать один и тот же результат - "неопределенный".

Другие вопросы по тегам