Ключевое слово var в выражениях try / catch: ошибка JSLint или глобальное присваивание? - PullRequest
9 голосов
/ 10 ноября 2011

Я заметил интересный результат от JSLint при исследовании вопроса codereview . JSLint пожаловался, что переменная использовалась до того, как была определена . Вот сокращенная версия кода, которая дает тот же результат:

(function () {
    try {
        var a = 0;
        throw { name: "fakeError" };
    } catch (e) {
        a = 1;
    }
}());

Мое понимание JavaScript говорит, что приведенный выше код должен быть эквивалентен:

(function () {
    var a;
    try {
        a = 0;
        throw { name: "fakeError" };
    } catch (e) {
        a = 1;
    }
}());

и действительно, ни один из примеров не приводит к существованию a в глобальной области видимости при запуске через Firebug. Я взглянул на раздел 12.14 спецификации ECMA-262 , но не вижу ничего, что заставило бы меня думать, что функции должны рассматриваться по-разному. Это просто ошибка в JSLint или эти два выражения отличаются по функциональности?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Это просто ошибка, но параметры JSLint по умолчанию предпочли бы, если бы вы все равно переместили все свои операторы var в верх.

1 голос
/ 23 февраля 2017

Хотя некоторые блоки кода заключены в фигурные скобки {...} просто не создает новую область видимости в javascript, catch является исключением, как отмечено в ECMAScript 5 spec , Код внутри блока catch имеет другую область видимости по сравнению с кодом снаружи.он обрабатывается как функции внутренней области видимости.

Другими словами, как отмечено здесь :

Блок захвата уникален в этом JavaScript создает этот идентификатор при вводе блока catch и добавляет его в текущую область видимости;идентификатор длится только на время блока улова;после завершения выполнения блока catch идентификатор больше недоступен.

function f() {
  try {
    throw "foo";
  } catch (e) {
  }
  // e undefined here
}

И, как вы знаете, нельзя ожидать поднятия переменной из 2 разных областей кода в javascript.Итак, JSLint жалуется, потому что он / она ;-) это знает.

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