Если при компиляции обрабатывается сразу вся программа, при интерпретации исходный код преобразуется строка за строкой; после выполнения каждой строки или команды происходит немедленный переход к следующей строке исходного кода.
Если переменная является источником, безрезультатный поиск идентификатора считается необъявленной (неизвестной, отсутствующей) переменной, что всегда приводит к выдаче ошибки ReferenceError.
var studentName;
typeof studentName; // "undefined"
«Не определен» в данном случае означает «не объявлен», т.е. у переменной нет подходящего формального объявления в любой лексически доступной области видимости. С другой стороны, «неопределенный» в действительности означает, что переменная была найдена (объявлена), но на данный момент она не содержит другого значения, поэтому по умолчанию в ней хранится значение undefined.
Менеджер области видимости для глобальной области видимости просто создает глобальную переменную для реализации присваивания приемнику!
Иначе говоря, хотя области видимости определяются во время компиляции, их фактическое создание откладывается до стадии выполнения.
область видимости JS определяется на стадии компиляции; такая разновидность областей видимости называется лексической областью видимости.
это очень плохая идея по соображениям быстродействия и удобочитаемости.
Всеми силами избегайте eval(..) (по крайней мере, eval(..) с созданием объявлений) и with.
область видимости определяется при компиляции программы и обычно не должна зависеть от условий на стадии выполнения. Тем не менее в нестрогом режиме технически это правило можно обойти двумя способами, изменяя области видимости программы во время выполнения.
Автоматическое связывание функции с переменной называется поднятием функции (function hoisting).