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