Я пытался укрепить мое понимание контекста выполнения JS, и у меня возникли проблемы с получением объяснения, почему код, приведенный ниже, не выводит «hello world».
var foo = "foo";
function test1() {
console.log(foo)
var bar = "hello world";
test2();
}
function test2() {
console.log(bar);
}
test1();
По моему (очень сомнительному) пониманию, test2()
, будучи выполненным внутри test1()
, имеет доступ к контексту выполнения test1()
и должен иметь возможность разрешать имя переменной bar
путем перемещения вверх по цепочке областей действия в контекст выполнения test1()
, где определено bar
. Вместо этого я получаю ошибку ссылки при попытке напечатать bar
.
. Я могу понять, как работает приведенный ниже код, из-за лексической области видимости JS, но я был бы признателен за объяснение того, как JS интерпретирует каждый по-разному с точки зрения контекста исполнения и цепочек контекста.
function test1() {
console.log(foo)
var bar = "hello world";
function test2() {
console.log(bar);
}
test2();
}
test1();
До сих пор моя лучшая попытка найти объяснение для себя заключалась в изменении первого блока кода следующим образом:
var foo = "foo";
var bar = "not hello world :("
function test1() {
console.log(foo)
var bar = "hello world";
test2();
}
function test2() {
console.log(bar);
}
test1();
Здесь вызов test2()
выводит "not hello world :(", определенный в глобальной области видимости. Сначала я подумал, что test2()
поднимается по цепочке областей видимости в контекст выполнения test1
, в глобальную область. контекст выполнения, но это не кажется правильным, поскольку он нашел бы определение для bar
внутри test1()
до достижения глобального определения. Таким образом, мое второе предположение состоит в том, что определение test2()
создает " закрытие "-подобный захват глобального контекста выполнения, когда он был определен, и вызов его в пределах test1()
приводит к значению для bar
значения null / undefined, поскольку это было его значение при определении функции (вообще не имеет декларации для подъема). Таким образом, он не перемещается в контекст выполнения test1()
для поиска идентификатора.
Любые объяснения / ресурсы были бы чрезвычайно полезны. Я, очевидно, очень плохо знаком с языком, поэтому извиняюсь, если мой словарный запас / терминология не совсем верны. Заранее спасибо за помощь.