JSLint: był używany przed zdefiniowaniem

95

Cześć, mam 3 pliki javascript.

  • jquery.js
  • utility.js
  • plik1.js

W file1.js mam

jQuery.noConflict()
jQuery(document).ready(function($) { 
 // ....
});

Pojawia się błąd „jQuery” został użyty przed zdefiniowaniem. a „dokument” został użyty przed jego zdefiniowaniem.

Jak bezpiecznie pozbyć się tego ostrzeżenia.

Jeśli zrobię

var document = document || {}; 

wtedy w moim pliku utility.js, jeśli jest używany, będzie miał wartość null w IE i ok w Firefoksie.

Jakie jest najlepsze rozwiązanie tego problemu?

Chun ping Wang
źródło
możliwy duplikat JS Lint: „skrót” został użyty przed jego zdefiniowaniem . Upewnij się również, że w opcjach wybrano opcję Załóż przeglądarkę .
Andy E
@ChunpingWang Zauważyłem, że nadal jesteś aktywny w SO i na to pytanie brakuje zaakceptowanej odpowiedzi. Czy w którejkolwiek z tych odpowiedzi brakuje czegoś, co jest potrzebne, aby były akceptowane? Wygląda na to, że odpowiedź Quentina rozwiązałaby zadany problem. Jakieś dodatkowe informacje potrzebne, aby odpowiedzieć na Twoje pytanie?
ruffin

Odpowiedzi:

169

Z dokumentacji

JSLint rozpoznaje również dyrektywę / * global * /, która może wskazywać JSLint, że zmienne użyte w tym pliku zostały zdefiniowane w innych plikach. Komentarz może zawierać listę nazwisk oddzielonych przecinkami. Po każdej nazwie może opcjonalnie występować dwukropek i wartość true lub false, true wskazując, że zmienna może być przypisana przez ten plik, oraz false wskazująca, że ​​przypisanie nie jest dozwolone (co jest wartością domyślną). Dyrektywa uwzględnia zakres funkcji.

Niektóre wartości globalne można wstępnie zdefiniować. Wybierz opcję Załóż przeglądarkę (przeglądarkę), aby wstępnie zdefiniować standardowe właściwości globalne dostarczane przez przeglądarki internetowe, takie jak dokument i addEventListener.

Przykład:

/*jslint browser: true*/
/*global $, jQuery*/
Quentin
źródło
25
uwaga: nie możesz wstawić spacji wcześniej, globalwięc /* global var, var2 */nie działa. /*global var, var2*/działa
radixhound
4
Liczba mnoga jest równoważna i również działa: /*globals */a także ma większy sens przy dodawaniu listy zmiennych
Robert Koritnik
2
Więc rozwiązanie JSLint narzekającego, że brakuje czegoś we wszystkich twoich plikach, to dodanie linii do wszystkich twoich plików ... To jest okropna rada.
Cerin
@Cerin - Nie, rozwiązaniem problemu JSLint narzekającego, że używasz zmiennej, dla której nie może znaleźć definicji, jest poinformowanie go, że zdefiniowałeś ją w innym pliku (w przeciwieństwie do, na przykład, popełnienia błędu w nazwie zmiennej to zepsuje twój program później).
Quentin,
1
@Quentin, tak, a twoja poprawka wymaga, abyś „mówił o jQuery” w każdym pojedynczym pliku. To ogromna ilość pracy na coś, co nie daje żadnych korzyści. Równie dobrze możesz po prostu wyłączyć to sprawdzanie w JSLint.
Cerin,
30

Jak mówi Quentin, jest /*global*/dyrektywa.

Oto przykład (umieść go na początku pliku):

/*global var1,var2,var3,var4,var5*/

Upewnij się, że początkowa instrukcja globalna znajduje się w tym samym wierszu co /*, w przeciwnym razie się zepsuje.

stanton
źródło