Регистрация объявлений переменных и функций в 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' внутри своей области видимости.
Тем не менее, обе программы будут выдавать один и тот же результат - "неопределенный".