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