W moim projekcie (tylko w kontekście przeglądarki) chcę użyć narzędzia jakości kodu JS. Próbowałem zarówno jslint
i eslint
. Chcę, żeby linter pomógł mi uczynić mój kod czysty, przejrzysty, odporny na błędy i poprawić jego ogólną jakość. Czego nie chcę robić, to nie chcę pisać jakichś brudnych hacków lub używać złych praktyk po to, by uszczęśliwiać linters.Definiowanie funkcji JavaScript
Jestem zaniepokojony tylko jednym problemem. Obaj zgłosili problem, że używam funkcji przed jej zdefiniowaniem. Oczywiście w poniższym fragmencie kodu bar
nie zostanie wywołany przed jego definicją.
function foo() {
bar();
}
function bar() {
}
foo();
W najprostszym scenariuszu można po prostu przenieść bar
przed foo
. Ale są przypadki, kiedy jest to po prostu niemożliwe. Pierwsza funkcja korzysta z drugiej, druga z trzeciej, a trzecia z pierwszej.
Wygląda na to, że mogę sprawić, że linters będzie szczęśliwy, deklarując wszystkie funkcje przed ich definicjami takimi jak to.
var foo;
var bar;
foo = function() {
bar();
};
bar = function() {
};
foo();
Pytania są:
- Czy pierwszy fragment kodu złamany? Nie sądzę.
- Czy pierwszy błąd kodu jest podatny na błędy? Chyba - może.
- Czy dobrą praktyką jest organizowanie kodu takiego jak drugi fragment (deklarowanie funkcji przed ich zdefiniowaniem)?
- Jeśli powinienem trzymać się tej praktyki, nie powinienem?
- Jeśli jest
no
, jaka jest dobra praktyka w tym zakresie? - Czy warto zwracać uwagę na ten błąd lasera, czy też powinienem go wyłączyć?
Czy próbowałeś przełączania pozycje 'foo' i' bar' w kodzie? – Justinas
@Justinas w tym najprostszym scenariuszu mogę po prostu przesunąć pasek przed foo. Ale są przypadki, kiedy jest to po prostu niemożliwe. Pierwsze wywołanie funkcji drugie, drugie wywołanie trzecie, a trzecie wywołanie pierwsze. – Kolyunya
Może, o ile wiem, pierwszy przypadek jest bardzo bezpieczny w porównaniu do drugiego. Nawet wina * lint *. Powodem jest to, że w javascriptie funkcje są wykonywane tylko wtedy, gdy wszystkie są zdefiniowane, więc masz problem tylko wtedy, gdy * bar() * nigdy nie zostanie zdefiniowany. W drugim przypadku można wykonać * bar() *, gdy jest niezdefiniowany. Tylko dlatego, że wywołujesz * foo() * przed definicją * bar() *. To dlatego, że w drugim przypadku przypisujesz funkcje do zmiennych, które mają inną deklarację/definicję zachowania. –