Нет ли подъема в вылове? - PullRequest
1 голос
/ 28 марта 2019

У меня есть этот код:

(function() {
   var ex;
   try {
       throw new Error('blah');
   } catch(ex) {
       console.log('ex i here:', ex);
   }
   console.log('ex out here:', ex);

   return 'hi';
})()

Эти журналы:

ex i here: ошибка ('бла');

ex здесь: undefined

Почему это так? Я думаю, что из-за подъема ex будет установлен за пределами этого блока, поэтому он должен быть доступен в ex out here.

Я ожидал, что он будет работать аналогично циклу for:

for (i=0; i<2; i++) {
}
console.log(i); // gives 2

Ответы [ 3 ]

3 голосов
/ 28 марта 2019

Вы что-то напутали.

Переменные, определенные как var, имеют область действия. Параметр в catch не поднят, он имеет область видимости (только в этой части перехвата).

Как вы можете видеть в этом примере: ab поднимается, а затем становится доступным вне улавливающей части. ex2 не существует вне контекста.

(function() {
   var ex;
   try {
       throw new Error('blah');
   } catch(ex2) {
       var ab = 3;
       console.log('ex is here:', ex2.message);
   }
   console.log(ab);
   console.log(ex2);
   console.log('ex out here:', ex);

   return 'hi';
})()

В вашем примере есть другая переменная, созданная с тем же именем, но с другой областью действия. Если это происходит, то (почти во всех языках) используется самая глубокая переменная в вашем контексте. Если вы хотите устранить ошибку за пределами хостинга, вы можете:

(function() {
   try {
       throw new Error('blah');
   } catch(ex2) {
       var ex = ex2;
       console.log('ex is here:', ex2.message);           
   }
   console.log(ex.message);

   return 'hi';
})()
2 голосов
/ 28 марта 2019

Этот код ведет себя так:

  (function() {
   var ex1;
   try {
       throw new Error('blah');
   } catch(ex2) {
       console.log('ex i here:', ex2);
   }
   console.log('ex out here:', ex1);

   return 'hi';
  })()

Это потому, что секунда, объявленная в улове ex, видна только в области видимости улова, для получения дополнительной информации посещение


Что касается цикла, в этих итерациях js ищет объявление переменной "i" ближайшей области видимости, в которой оно содержится, и в этом случае это родительская переменная, поэтому изменяющаяся переменная "i"объявляется в начале, так как внутри цикла de нет объявления переменной.

1 голос
/ 28 марта 2019

С try ... catch оператор :

Когда в блоке try генерируется исключение, exception_var (например, e в catch (e)) содержит значение, указанное в операторе throw.Вы можете использовать этот идентификатор для получения информации об исключении, которое было сгенерировано.Этот идентификатор является локальным для предложения catch.То есть он создается при вводе предложения catch и после завершения выполнения предложения catch идентификатор больше недоступен.

...