JSHint и jQuery: «$» не определено

215

Следующий JS:

(function() {
  "use strict";

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

}());

Урожайность:

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

При окраске с использованием JSHint 0.5.5. Любые идеи?

Аллил Изоцианат
источник
Вы добавили jquery.jsна свою страницу?
Рори МакКроссан
4
Ну, если вы кормите его только этим кодом, $ он не определен.
Заостренный
У меня есть эта проблема в угловых. Просто измените $ на angular.element и jshint no warn
Рафаэль Витор

Ответы:

381

Если вы используете относительно свежую версию JSHint, обычно предпочтительным подходом является создание файла .jshintrc в корне вашего проекта и размещение в нем этой конфигурации:

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

Это объявляет JSHint, что $ является глобальной переменной, а false указывает, что она не должна быть переопределена.

Файл .jshintrc не поддерживался в действительно старых версиях JSHint (например, v0.5.5, как в первоначальном вопросе 2012 года). Если вы не можете или не хотите использовать файл .jshintrc, вы можете добавить его вверху файла скрипта:

/*globals $:false */

Существует также сокращенная опция jshint «jquery», как показано на странице параметров JSHint .

Стивен Бухер
источник
47
Эта опция, jquery, просто определяет две глобальные переменные только для чтения: $ и jQuery. Это более короткая версия /*global $:false, jQuery:false */.
Антон Ковалев
1
В моем JSHint для Visual Studio опция называется «предположить, что jQuery»
Jowen
2
Опция flag - это путь. Для новичков: добавьте строку «jquery: true» в ваш файл .jshintrc.
genkilabs
3
В чем причина ": false"? Я обнаружил, что / * global $ * / работает просто отлично. (В моем случае это был / * глобальный jQuery * / хотя)
Michiel
Есть ли способ установить это общее для всех функций в сценарии, а не вводить один за другим в /* global ... */ ? Обычно я импортирую сценарий со всеми своими функциями в свой, mainпоэтому его
сложно
148

Вы также можете добавить две строки в ваш .jshintrc

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

Это говорит jshint, что есть две глобальные переменные.

wmil
источник
3
это должен быть принятый ответ. загрязнение КАЖДОГО ОДНОГО ФАЙЛА JavaScript в вашем проекте различными строками кода, чтобы осчастливить проверку синтаксиса, не вариант. Спасибо wmil
Космин
51

Все, что вам нужно сделать, это установить "jquery": trueв своем.jshintrc .

В соответствии с опциями JSHint :

JQuery

Эта опция определяет глобальные переменные, предоставляемые библиотекой jQuery JavaScript.

Нирен
источник
6
Вероятно, это должен быть главный ответ ... позор, это похоронено здесь
Зак Лисобей
Где найти файл .jshintrc в Sublime text 3? Я попытался поместить эту опцию в файл SublimeLinter.sublime-settings (Preferences-> Package Package-> SublimeLinter-> Settings-Default), а также попытался создать новый файл .jshintrc (my.jshintrc) в корневой директории моего проекта, в соответствии с jshint.com/docs . Не это помогло мне.
Милос
@Milos Установите JSHint Gutter в сублиметексте 3. Перейдите в Инструменты> JSHint> Установить настройки Linting, откроется .jshintrc.
нирен
1
Ничего, он все еще не может распознать знак "$". Когда я открываю .jshintrc, он находится по пути: \ AppData \ Roaming \ Sublime Text 3 \ Packages \ JSHint Gutter, я помещаю "jquery": true и ничего не происходит.
Милош
Гораздо лучший ответ, чем добавление переменных в глобальный раздел! Решите это так!
Матиас Кляйн
16

Вот небольшой список, который можно добавить в ваш файл .jshintrc, который
я добавлю в этот список по прошествии времени.

{
  // 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
  },
}
Джеймс Харрингтон
источник
1
Если вы установите для параметров "browser" и "node" значение "true", единственными необходимыми оставшимися элементами в этом списке являются $, jquery и angular. Для получения дополнительной информации см. Раздел «Окружающая среда» документации: jshint.com/docs/options/#environments
user456584
Я отредактировал ответ, включив ваше обновление, спасибо @ user456584
Джеймс Харрингтон
8

Если вы используете редактор IntelliJ, такой как WebStorm, PyCharm, RubyMine или IntelliJ IDEA:

В разделе «Среда» файла / «Настройки» / «JavaScript» / «Инструменты качества кода» / JSHint установите флажок «jQuery».

Джо Голтон
источник
1
Также обратите внимание, что вы можете переопределить все внутренние конфигурации, установив флажок «использовать файл конфигурации». Это заставит WS видеть изменения файла конфигурации. Без этого он просто игнорирует это.
neoswf
3

Вместо того, чтобы рекомендовать обычное «отключение глобалов JSHint», я рекомендую использовать шаблон модуля для решения этой проблемы. Он сохраняет ваш код в «замкнутом» виде и повышает производительность (на основе «10 вещей, которые я узнал о Jquery» Пола Айриша ).

Я склонен писать шаблоны своих модулей следующим образом:

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

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

Вы можете получить эти другие преимущества производительности (объяснено больше здесь ):

  • При минимизации кода переданное в windowобъекте объявление также минимизируется. например, window.alert()статьm.alert() .
  • Код внутри самоисполняющейся анонимной функции использует только 1 экземпляр window объекта.
  • Вы переходите к погоне при вызове windowсвойства или метода, предотвращая дорогой обход цепочки областей действия, например window.alert()(быстрее) по сравнению сalert() (медленнее) производительности.
  • Локальный объем функций через «пространство имен» и сдерживание (глобальные перемены - это зло). Если вам нужно разбить этот код на отдельные сценарии, вы можете создать подмодуль для каждого из этих сценариев и импортировать их в один основной модуль.
Аластер Парагас
источник
2
Я также использую этот шаблон, но он не решает исходную проблему для меня. JSHint по-прежнему жалуется, что переменная не определена в последней строке ( "}(window))«в вашем примере - у меня были проблемы также с jQuery и Highcharts). Я не нашел способа отключить его, кроме определения глобального для файла, который затем побеждает цель.
Мирозия
@myrosia browser: trueсообщает JSHint, что вы ожидаете среду браузера (где windowона уже определена).
Сэм
Мне нравится этот подход!
Джетро
2

Если вы используете редактор IntelliJ, в

  • Настройки / Настройки
    • Javascript
      • Инструменты качества кода
        • JSHint
          • Предопределенный (внизу), нажмите Установить

Например console:false, вы можете ввести что угодно, и это добавит это к списку (.jshintrc), а также к глобальному.

knowncitizen
источник
2

Чтобы исправить эту ошибку при использовании онлайн-реализации JSHint :

  • Нажмите «КОНФИГУРАЦИЯ» (верхняя часть среднего столбца на странице)
  • Включите "jQuery" (в разделе "ASSUME" внизу)
Тони Л.
источник
0

Вы, вероятно, хотите сделать следующее,

const $ = window.$

чтобы избежать этого бросая ошибку линтинга.

нилаканта сингх део
источник