Почему переназначение переменной 'error' функционально не ограничено внутри блока catch {}? - PullRequest
0 голосов
/ 02 мая 2019

Я работаю с блоками try-catch в JavaScript и столкнулся с некоторым изменяемым поведением области видимости, которое мне не совсем понятно.

Я понимаю, что console.log(boo) выводит 20 на консоль, поскольку переменная была объявлена ​​с ключевым словом var и, следовательно, она функционально ограничена (то есть не относится к блоку в блоке catch).

Однако я не понимаю, почему переменная err также не ограничена IIFE так же, как переменная boo.Поэтому я не понимаю, почему это undefined вне блока catch.

(function() {
  try {
    throw new Error();
  } catch (err) {
    var err = 10;
    var boo = 20;
    console.log(err); //'10' (as I expect)
  }
  // Why doesn’t this log '10' ???
  console.log(err); // 'undefined' (but I expected '10')

  console.log(boo); // '20' (as I expect)
})();

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

В то время как var поднимает символ в верхнюю часть функционального блока, «аргумент» предложения catch является локальным по отношению к предложению.Поскольку вы назвали значение hoisted таким же, как символ предложения, это может быть довольно запутанным.По сути, ваш код такой же, как:

(function () {
var err;
var boo;
try {
    throw new Error();
  } catch (err) {
    err = 10; // Set the catch's "local" `err` identifier to `10`
    boo = 20;
    console.log(err);
  }
  console.log(err); // The hoisted `err` was never set.
  console.log(boo); // ’20’ (as I expect)
})();
2 голосов
/ 02 мая 2019

Я нашел ответ.

Это потому, что исключение 'идентификатор' (которое является переменной 'err' в приведенном выше примере) недоступно после завершения выполнения блока catch.Это похоже на особый случай обработки области видимости в JS и определенно является «уловкой», пока кто-то не копает.

Надеюсь, это поможет кому-то еще!

Из документов : enter image description here

...