Zauważyłem interesujący wynik z JSLint podczas badania pytania codereview. JSLint narzekał, że zmienna była używana przed jej zdefiniowaniem. Oto skrócona wersja kodu, który daje ten sam wynik:Zmienna słowa kluczowego w wyrażeniach try/catch: błąd JSLint lub zadanie globalne?
(function() {
try {
var a = 0;
throw { name: "fakeError" };
} catch (e) {
a = 1;
}
}());
Moje rozumienie JavaScript mówi, że powyższy kod powinien być równoważny:
(function() {
var a;
try {
a = 0;
throw { name: "fakeError" };
} catch (e) {
a = 1;
}
}());
i rzeczywiście, ani przykład powoduje a
istnieć w zasięgu globalnym po uruchomieniu przez Firebug. Spojrzałem na sekcję 12.14 z ECMA-262 spec, ale nie widzę niczego, co mogłoby doprowadzić mnie do myślenia, że funkcje powinny być traktowane inaczej. Czy jest to tylko błąd w JSLint, czy te dwa wyrażenia różnią się w pewien funkcjonalny sposób?