2011-09-15 15 views
22

Dlaczego JSLint narzeka, jeśli coś używa funkcji, która nie została jeszcze zdefiniowana? Chodzi o to, że funkcja jest zdefiniowana - i jeśli to coś wywołuje tę funkcję, ta funkcja istnieje i rzeczy będą działać.Błąd jsLint: "somefunction() zostało użyte zanim zostało zdefiniowane"

Spójrz na poniższy kod:

function foo() 
{ 
    // calls bar() 
}; 

function bar() 
{ 
    // calls foo() 
}; 

Nie ma sposobu, aby zorganizować metody 2 w taki sposób, że miałoby to JSLint zadowolony. Jak sobie z tym poradzić?

Odpowiedz

13

Zobacz tę odpowiedź:

Contending with JS "used before defined" and Titanium Developer

Zasadniczo, jeśli użyć formularza foo = function() { ... } można zadeklarować var foo, bar; na górze, aby uniknąć błędów JSLint.

+5

Ale to tylko odrobinę inny niż "funkcja foo()", będący wyrazem funkcji i wszystkim. Plus, deklarowanie 'var foo, bar' na górze jest zbędne z powodu podnoszenia. Krótko mówiąc, 'var foo = function() ..., var bar = function() ...' zrobi wszystko dobrze technicznie. Dodatkowo, myślę, biorąc pod uwagę, że deklaracje funkcji są ładowane przed czymkolwiek innym - JSLint powinien już naprawić swoje rzeczy. – ZenMaster

+8

@ZenMaster: Rozwidlenie 'jslint', [' jsHint'] (http://www.jshint.com/docs/), rozwiązało to, pozwalając ci ustawić '' latedef ": false' w opcjach. (Nie wpływa na nazwy zmiennych, tylko nazwy funkcji.) –

+1

Ta odpowiedź złamie kod, który opiera się na podnoszeniu definicji funkcji. ~ –

15

JSLint nie może sobie z tym poradzić, o ile wiem, ale JSHint, oparty na JSLint, rozwiązuje ten problem w odpowiedni sposób.

Wystarczy użyć właściwości "latedef" i ustawić ją na "false". Jeśli mimo to chcesz wykryć tego rodzaju problematyczne definicje zmiennych, ale chcesz korzystać z wyrażeń funkcyjnych i pozwolić na ich wciągnięcie, możesz ustawić "latedef": "nofunc".

Sprawdź to here.

+0

Jedna uwaga - wartość "nofunc" dla opcji "latedef" pomaga uniknąć inspekcji dla deklaracji funkcji (nie wyrażeń). – Alexei

Powiązane problemy