2016-08-10 16 views
12

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ć?
+0

Czy próbowałeś przełączania pozycje 'foo' i' bar' w kodzie? – Justinas

+0

@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

+0

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. –

Odpowiedz

2

Nie, fragmenty nie są zepsute, ale nie stanowią najlepszej praktyki.

var foo = function(){ 

} 

var bar = function(){ 
    foo(); 
} 

bar(); 

rzeczywiście stać:

var foo, bar; 

foo = function(){ 

} 

bar = function(){ 
    foo(); 
} 

bar(); 

Stąd należy zdefiniować wszystkie zmienne i funkcje na początku zakresu. JavaScript używa Hoisting , która skutecznie przenosi wszystkie deklaracje zmiennych i funkcji na górę zakresu.

Samodzielne wykonanie jest uważane za najlepszą praktykę i zwiększa czytelność.

Eslint sprawdzi przeciwko regule Vars na wierzchu które jest zdefiniowane i udokumentowane here

https://www.reddit.com/r/learnjavascript/comments/3cq24a/crockford_says_hoisted_variable_declarations_are/ https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/

+1

Drugi fragment kodu jest uważany za dobrą praktykę, prawda? – Kolyunya

+0

tak dokładnie. Przynajmniej to właśnie Crockford mówi: –

+0

O Hoisting, nie jestem ekspertem, ale w js deklaracje zmiennych nie są przenoszone na początek zakresu, tylko deklaracje funkcji. przykład: funkcja asd() { console.log ('1 .:' + asdvar); var asdvar = 'sir asdalot'; console.log ('2 .:' + asdvar); } – kailniris

1
  1. Czy pierwszy fragment kodu złamany? nie, nie jest zepsuty.
  2. Czy pierwszy błąd kodu jest podatny na błędy? Nie.
  3. Czy dobrą praktyką jest organizowanie kodu takiego jak drugi fragment (deklarowanie funkcji przed ich zdefiniowaniem)? NIE, istnieje wiele innych dobrych sposobów.
  4. Jeśli tak, powinienem trzymać się tej praktyki, nieprawdaż? Tak
  5. Jeśli nie, jaka jest dobra praktyka w tym zakresie? istnieje wiele dobrych wzorców, które można śledzić:
  6. Czy warto zwrócić uwagę na ten błąd lasera, czy też powinienem go wyłączyć? Warto dbać o to, aby Twój kod był czysty.

Zawsze używaj trybu ścisłego. "use strict"

mają ci funkcji wewnątrz zakresu jak Iife za brak zmiennych globalnych za

read more about IIFE

function foo() { 
    bar(); 
}; 

function bar() { 

}; 
+0

Zakres nie stanowi problemu. Jak widać w jego edycji, że umieszczenie deklaracji na górze fragmentu rozwiązało problem.Jest prawdopodobne, że eshint sprawdził przeciwko "vars-on-top" (jak połączono w mojej odpowiedzi) –

+0

Rozumiem, ale to kwestia wyboru z linta :-) wolałbym nie mieć vars predefiniowanych na górze –

Powiązane problemy