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
好吧,如果您仅提供该代码本身,$ 未定义的。
Pointy 2012年

我在角度上有这个问题。只需将$更改为angular.element和jshint,就不会发出警告
Raphael Vitor

Answers:


381

如果使用相对较新的JSHint版本,通常首选的方法是在项目的根目录中创建一个.jshintrc文件,并将此配置放入其中:

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

这向JSHint声明$是全局变量,而false表示不应覆盖它。

真的较旧的JSHint版本(例如像2012年的原始问题那样的v0.5.5)不支持.jshintrc文件。如果您不能或不想使用.jshintrc文件,则可以在脚本文件的顶部添加此文件:

/*globals $:false */

还有一个简写的“ jquery” jshint选项,如JSHint选项页面所示


47
该选项jquery只是定义了两个只读全局变量:$和jQuery。它是的较短版本/*global $:false, jQuery:false */
安东·科瓦廖夫

1
在我的Visual Studio
JSHint中

2
选项标志是解决方法。对于初次使用的定时器:在.jshintrc文件中添加“ jquery:true”行。
genkilabs 2014年

3
“:false”的原因是什么?,我发现/ * global $ * /可以正常工作。(在我的情况下是/ * global jQuery * /尽管)
Michiel

有没有一种方法可以对脚本中的所有函数进行一般设置,而不是在其中一一输入/* global ... */?我通常将具有所有功能的脚本导入到我的脚本中,main因此一一定义是很麻烦的……
tsando 17/09/25

148

您也可以在.jshintrc中添加两行

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

这告诉jshint有两个全局变量。


3
这应该是公认的答案。用各种代码行污染项目中的每个javascript文件,以使语法检查器感到满意不是一种选择。感谢wmil
Cosmin

51

您需要做的只是"jquery": true在您的中设置.jshintrc

根据JSHint选项参考

jQuery的

此选项定义jQuery JavaScript库公开的全局变量。


6
这应该是最好的答案……可惜它埋在这里
Zach Lysobey 2015年

在Sublime文本3中的哪里找到.jshintrc文件?我试图将这个选项放在SublimeLinter.sublime-settings文件中(Preferences-> Package Settings-> SublimeLinter-> Settings-Default),并且还尝试在项目根目录中创建新的.jshintrc文件(my.jshintrc)。jshint.com/docs。这些都不帮助我。
米洛斯(Milos)2015年

@Milos以sublimetext安装JSHint Gutter。3。转到“工具”>“ JSHint”>“设置Linting首选项”,它将打开.jshintrc。
niren

1
再也没有,它仍然无法识别“ $”符号。当我打开.jshintrc时,它位于路径:\ AppData \ Roaming \ Sublime Text 3 \ Packages \ JSHint Gutter中,我输入了“ jquery”:true,没有任何反应。
米洛斯

比在globals部分添加变量要好得多!用这种方式解决!
马提亚斯·克莱恩

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
如果将“浏览器”和“节点”选项设置为“ true”,则此列表中仅剩余的必要项是$,jquery和angular。有关更多信息,请参见文档的“环境”部分:jshint.com/docs/options/#environments
user456584 2014年

我已经编辑了答案,以包含您的更新,谢谢@ user456584
James Harrington

8

如果您使用的是WebStorm,PyCharm,RubyMine或IntelliJ IDEA等IntelliJ编辑器:

在“文件/设置/ JavaScript /代码质量工具/ JSHint”的“环境”部分中,单击“ jQuery”复选框。


1
还请注意,您可以通过选中“使用配置文件”来覆盖所有内部配置。这将使WS看到配置文件的修改。没有它,他只会忽略它。
neoswf 2015年

3

我建议不要使用通常的“关闭JSHint全局变量”,而建议使用模块模式来解决此问题。它使您的代码“保持”并提高了性能(基于Paul Irish的“我从Jquery中学到的10件事”)。

我倾向于这样写我的模块模式:

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

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

您还可以获得以下其他性能优势(在此处有更多说明):

  • 压缩代码时,传入的window对象声明也将缩小。例如window.alert()成为m.alert()
  • 自执行匿名函数中的代码仅使用该window对象的1个实例。
  • 调用window属性或方法时,您切入正题,以防止昂贵的范围链遍历,例如window.alert()(更快)与alert()(慢)性能。
  • 通过“命名空间”和包含(全局变量是邪恶的)来实现局部功能范围。如果需要将此代码分解为单独的脚本,则可以为每个脚本创建一个子模块,并将它们导入一个主模块中。

2
这也是我使用的一种模式,但是它不能为我解决最初的问题。JSHint仍然抱怨最后一行没有定义变量("}(window))在您的示例中为”-我在jQuery和Highcharts上也遇到了问题)。除了为文件定义全局变量外,我没有找到其他方法来将其关闭,然后挫败了目标
myrosia 2014年

@myrosia browser: true告诉JSHint ,您期望使用浏览器环境(window已在其中定义)。
萨姆

我喜欢这种方法!
jethroo

2

如果您使用的是IntelliJ编辑器,请在

  • 首选项/设置
    • Java脚本
      • 代码质量工具
        • 捷迅
          • 预定义(在底部),单击设置

您可以输入任何内容,例如console:false,它也会将其添加到列表(.jshintrc)中-也是全局的。


2

要在使用在线JSHint实现时解决此错误:

  • 单击“配置”(页面中间列的顶部)
  • 启用“ jQuery”(在底部的“ ASSUME”部分下)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.