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

Я заметил интересный результат от 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, или два выражения функционально различаются?

9
задан Community 13 April 2017 в 12:40
поделиться