Как вы знаете, в JavaScript, если вы объявите переменную без ключевого слова "var", она будет добавлена в глобальную область (объект окна).
Но если переменная объявлена внутри функции без использования ключевого слова «var», она не будет добавлена в глобальную область (объект окна), пока эта конкретная функция не будет вызвана.
В JavaScript вы должны понимать, как создавать контекст выполнения.
когда интерпретируется полный файл JS, память выделяется для всех функций и переменных (подъем).
Обратите внимание, что все переменные, которые объявлены вне функций, добавляются в глобальную область (объект окна).
Фаза исполнения:
Поскольку выполнение кода JS является синхронным (только одна строка за раз) и однопоточным, создается стек выполнения, а «глобальный контекст выполнения» помещается в стек выполнения.
Если при выполнении встречается вызов функции, для соответствующей функции создается «контекст выполнения функции» и помещается в тот же стек.
Теперь во время выполнения функции движок JS анализирует код и, если он встречает переменную, выделяется память, и если переменная объявляется без ключевого слова «var», она добавляет эту конкретную переменную в глобальную область. в противном случае эта конкретная переменная будет частью области действия функции (локальной области видимости).
Теперь давайте проверим ваши фрагменты кода:
function doThis(){
counter = 0;
return counter;
};
console.log (счетчик); // возвращает "ошибка ссылки: не удается найти переменную"
в этом примере, так как функция doThis () никогда не выполняется, переменная «counter» не выделяется никакой памяти и не является частью какой-либо области (глобальной / локальной). следовательно, в журнале консоли вы видите ошибку ссылки.
(function doThis(){
counter = 0;
return counter;
})();
console.log (счетчик); // возвращает 0
В качестве самопризываемой функции переменная «counter» будет выделена память и перемещена в глобальную область видимости (объект окна). следовательно, вы можете увидеть значение переменной «counter» в журнале консоли.