Поскольку любые ссылки на message
внутри scopeTest
будут ссылаться на ближайшую область действия , в которой объявлена переменная message
, то есть внутри функции scopeTest
.В то время, когда вы пытаетесь сослаться на него, message
идентифицируется как имя переменной в области действия внутри функции (то есть, когда вы ссылаетесь на нее, вы ссылаетесь на локальную переменную, а не на глобальнуюпеременная), но локальная переменная еще не была инициализирована - интерпретатор не пересек линию const message =
, поэтому переменная message
находится в демилитаризованной зоне или временной мертвой зоне - пытаясь сослаться на нее перед нейинициализация приведет к ошибке, которая не определена.
Если вы удалите const message
изнутри scopeTest
(так что ссылки на имя переменной message
будут ссылаться на глобальную переменную),или переместите const message
на выше test #1
(так, чтобы оно инициализировалось к тому времени, когда вы пытаетесь его зарегистрировать), оно будет работать как положено:
const message = 'starts with mssg #1'; //Global scope
function scopeTest() {
const message = 'changed to mssg #2';
console.log('1. test #1: ', message);
}
scopeTest();
и
const message = 'starts with mssg #1'; //Global scope
function scopeTest() {
console.log('1. test #1: ', message);
}
scopeTest();