JSHint i jQuery: „$” nie jest zdefiniowane

215

Następujący JS:

(function() {
  "use strict";

  $("#target").click(function(){
    console.log("clicked");
  });

}());

Wydajność:

test.js: line 5, col 3, '$' is not defined.

Po strzępieniu za pomocą JSHint 0.5.5. Jakieś pomysły?

Izocyjanian allilu
źródło
Dodałeś jquery.jsdo swojej strony?
Rory McCrossan
4
Cóż, jeśli go karmisz, sam kod $ jest niezdefiniowany.
Pointy
Mam ten problem pod kątem. Wystarczy zmienić $ na angular.element i jshint no warn
Raphael Vitor

Odpowiedzi:

381

Jeśli używasz stosunkowo najnowszej wersji JSHint, ogólnie preferowanym podejściem jest utworzenie pliku .jshintrc w katalogu głównym projektu i umieszczenie w nim tej konfiguracji:

{
    "globals": {
        "$": false
    }
}

To oświadcza JSHint, że $ jest zmienną globalną, a fałsz wskazuje, że nie należy jej zastępować.

Plik .jshintrc nie był obsługiwany w naprawdę starych wersjach JSHint (takich jak v0.5.5, podobnie jak oryginalne pytanie z 2012 roku). Jeśli nie możesz lub nie chcesz używać pliku .jshintrc, możesz dodać to u góry pliku skryptu:

/*globals $:false */

Istnieje również skrótowa opcja „jquery” jshint, jak widać na stronie opcji JSHint .

Stephen Booher
źródło
47
Ta opcja, jquery, po prostu definiuje dwie zmienne globalne tylko do odczytu: $ i jQuery. Jest to krótsza wersja /*global $:false, jQuery:false */.
Anton Kovalyov,
1
W moim JSHint dla Visual Studio opcja nazywa się „zakładaj jQuery”
Jowen
2
Flaga opcji jest właściwą drogą. Dla osób, które po raz pierwszy: dodaj wiersz „jquery: true” w pliku .jshintrc.
genkilabs
3
Jaki jest powód „: false” ?, znalazłem / * global $ * / działa dobrze. (W moim przypadku był / * global jQuery * / chociaż)
Michiel
czy istnieje sposób, aby ustawić to ogólnie dla wszystkich funkcji w skrypcie, zamiast wpisywać jeden po drugim /* global ... */? Zwykle importuję skrypt ze wszystkimi moimi funkcjami, mainwięc kłopotliwe jest definiowanie jeden po drugim ...
tsando
148

Możesz także dodać dwie linie do swojego .jshintrc

  "globals": {
    "$": false,
    "jQuery": false
  }

To mówi jshint, że istnieją dwie zmienne globalne.

wmil
źródło
3
to powinna być zaakceptowana odpowiedź. zanieczyszczenie KAŻDEGO POJEDYNCZEGO PLIKU javascript w twoim projekcie za pomocą różnych linii kodu, aby moduł sprawdzania składni był szczęśliwy, nie wchodzi w grę. Dzięki wmil
Cosmin
51

Wszystko, co musisz zrobić, to ustawić "jquery": truew swoim .jshintrc.

Zgodnie z opisem opcji JSHint :

jquery

Ta opcja definiuje globały ujawniane przez bibliotekę JavaScript jQuery.

niren
źródło
6
To chyba najlepsza odpowiedź ... szkoda, że ​​jest tu pochowany
Zach Lysobey
Gdzie znaleźć plik .jshintrc w Sublime text 3? Próbowałem umieścić tę opcję w pliku SublimeLinter.sublime-settings (Preferencje-> Ustawienia pakietu-> SublimeLinter-> Ustawienia-Domyślne), a także próbowałem utworzyć nowy plik .jshintrc (my.jshintrc) w katalogu głównym projektu, zgodnie z jshint.com/docs . To nie pomogło mi.
Milos,
@ Milos Zainstaluj JSHint Gutter w sublimetext 3. Przejdź do Narzędzia> JSHint> Ustaw preferencje dotyczące przycinania, otworzy się .jshintrc.
niren
1
Nic więcej, nadal nie rozpoznaje znaku „$”. Kiedy otwieram .jshintrc, jest na ścieżce: \ AppData \ Roaming \ Sublime Text 3 \ Packages \ JSHint Gutter, umieszczam „jquery”: prawda i nic się nie dzieje.
Milos,
Znacznie lepsza odpowiedź niż dodawanie zmiennych do sekcji globals! Rozwiąż to w ten sposób!
Matthias Kleine,
16

Oto szczęśliwa mała lista do umieszczenia w .jshintrc.
Dodam ją do tej listy w miarę upływu czasu.

{
  // other settings...
  // ENVIRONMENTS
  // "browser": true, // Is in most configs by default
  "node": true,
  // others (e.g. yui, mootools, rhino, worker, etc.)
  "globals": {
    "$":false,
    "jquery":false,
    "angular":false
    // other explicit global names to exclude
  },
}
James Harrington
źródło
1
Jeśli ustawisz opcje „przeglądarki” i „węzła” na „prawda”, jedynymi pozostałymi elementami na tej liście, które są niezbędne, są $, jquery i kątowe. Aby uzyskać więcej informacji, zobacz sekcję Dokumenty
user456584
Zredagowałem odpowiedź, aby dołączyć aktualizację. Dziękuję @ user456584
James Harrington
8

Jeśli używasz edytora IntelliJ, takiego jak WebStorm, PyCharm, RubyMine lub IntelliJ IDEA:

W sekcji Środowiska pliku / ustawień / JavaScript / narzędzi jakości kodu / JSHint kliknij pole wyboru jQuery.

Joe Golton
źródło
1
Zwróć też uwagę, że możesz zastąpić wszystkie konfiguracje wewnętrzne, zaznaczając „użyj pliku konfiguracji”. Spowoduje to, że WS zobaczy modyfikacje pliku konfiguracyjnego. Bez tego po prostu to ignoruje.
neoswf
3

Zamiast zalecać zwykłe „wyłączanie globów JSHint”, zalecam użycie wzorca modułu w celu rozwiązania tego problemu. Utrzymuje twój kod „zawarty” i zwiększa wydajność (na podstawie „10 rzeczy, których dowiedziałem się o Jquery” Paula Irlanda ).

Zwykle zapisuję moje wzorce modułów w ten sposób:

(function (window) {
    // Handle dependencies
    var angular = window.angular,
        $ = window.$,
        document = window.document;

    // Your application's code
}(window))

Możesz uzyskać te inne korzyści związane z wydajnością (wyjaśniono więcej tutaj ):

  • Podczas minimalizowania kodu przekazywana windowdeklaracja obiektowa również jest minimalizowana. np . window.alert()zostać m.alert().
  • Kod wewnątrz samoczynnie wykonującej się funkcji anonimowej wykorzystuje tylko 1 instancję windowobiektu.
  • Przechodzisz do sedna podczas wywoływania windowwłaściwości lub metody, zapobiegając kosztownym przechodzeniom łańcucha zasięgu, np. window.alert()(Szybszym) w porównaniu z alert()(wolniejszym) działaniem.
  • Lokalny zakres funkcji poprzez „przestrzeń nazw” i przechowywanie (globale są złe). Jeśli potrzebujesz podzielić ten kod na osobne skrypty, możesz utworzyć submoduł dla każdego z tych skryptów i zaimportować je do jednego głównego modułu.
Alastair Paragas
źródło
2
To również wzór, którego używam, ale nie rozwiązuje to dla mnie pierwotnego problemu. JSHint nadal narzeka, że ​​zmienna nie jest zdefiniowana w ostatnim wierszu ( "}(window))„w twoim przykładzie - miałem problemy również z jQuery i Highcharts). Nie znalazłem sposobu na wyłączenie tej opcji poza zdefiniowaniem globalnego pliku, który następnie pokonuje cel
myrosia
@myrosia browser: truemówi JSHint, że oczekujesz środowiska przeglądarki (gdzie windowjest już zdefiniowane).
sam
Podoba mi się to podejście!
jethroo
2

Jeśli używasz edytora IntelliJ, w sekcji

  • Preferencje / ustawienia
    • JavaScript
      • Narzędzia jakości kodu
        • JSHint
          • Wstępnie zdefiniowane (na dole), kliknij Ustaw

Możesz na przykład wpisać cokolwiek, console:falsea doda to również do listy (.jshintrc) - jako globalną.

znany obywatel
źródło
2

Aby naprawić ten błąd podczas korzystania z implementacji JSHint online :

  • Kliknij „KONFIGURUJ” (u góry środkowej kolumny na stronie)
  • Włącz „jQuery” (w sekcji „ASSUME” u dołu)
Tony L.
źródło
0

Prawdopodobnie chcesz wykonać następujące czynności,

const $ = window.$

aby uniknąć rzucania błędu kłaczkowania.

nilakantha singh deo
źródło