JS переменный подъем внутри затвора - PullRequest
1 голос
/ 29 февраля 2020

JS поднимает все переменные в области видимости, так почему этот код создает исключение:

(function() {

  function i() {
      console.log(a.a);
  }
  i();
  var a = { a:1 };
})()

Пока работает этот код:

(function() {
  var a = { a:1 };
  function i() {
      console.log(a.a);
  }
  i();

})()

Какое поведение интерпретатора вызывает это?

1 Ответ

4 голосов
/ 29 февраля 2020

Переменная a уже видна, но ее значение {a:1} не присваивается, пока выполнение не достигнет var. Ситуация несколько отличается для локальных функций, объявленных с function foo(){...}, потому что имена связаны с соответствующими функциями / замыканиями до начала выполнения.

Если вы вызываете замыкание i до присвоения a значения, которое вы получить проблему, однако с

(function(){
     function i(){
         console.log(foo());
     }
     i();
     function foo() { return 42; }
})();

выходное значение равно 42, и ошибки нет.

Обратите внимание, что это действительно так, поскольку используется оператор function ... изменяя код на

(function(){
     function i(){
         console.log(foo());
     }
     i();
     var foo = function(){ return 42; }
})();

выдает ошибку, потому что в этом случае при выполнении i() foo еще не привязан к функции (как в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...