JSHint và jQuery: '$' không được xác định


215

Mã sau:

(function() {
  "use strict";

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

}());

Sản lượng:

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

Khi sử dụng JSHint 0.5.5. Có ý kiến ​​gì không?


Bạn đã thêm vào jquery.jstrang của bạn?
Rory McCrossan

4
Chà, nếu bạn tự cung cấp mã đó, $ thì không xác định được.
Mũi nhọn

Tôi có vấn đề này trong góc. Chỉ cần đổi $ thành angular.element và jshint no warn
Raphael Vitor

Câu trả lời:


381

Nếu bạn đang sử dụng một phiên bản tương đối gần đây của JSHint, cách tiếp cận thường được ưa thích là tạo tệp .jshintrc trong thư mục gốc của dự án của bạn và đặt cấu hình này trong đó:

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

Điều này tuyên bố với JSHint rằng $ là biến toàn cục và sai chỉ ra rằng nó không nên bị ghi đè.

Tệp .jshintrc không được hỗ trợ trong các phiên bản thực sự cũ của JSHint (chẳng hạn như v0.5.5 như câu hỏi ban đầu vào năm 2012). Nếu bạn không thể hoặc không muốn sử dụng tệp .jshintrc, bạn có thể thêm tệp này ở đầu tệp tập lệnh:

/*globals $:false */

Ngoài ra còn có một tùy chọn jshint "jquery" tốc ký như đã thấy trên trang tùy chọn JSHint ..


47
Tùy chọn này, jquery, chỉ định nghĩa hai biến toàn cục chỉ đọc: $ và jQuery. Nó là một phiên bản ngắn hơn của /*global $:false, jQuery:false */.
Anton Kovalyov

1
Với JSHint cho Visual Studio của tôi, tùy chọn này được gọi là "giả sử jQuery"
Jowen

2
Cờ tùy chọn là cách để đi. Dành cho bộ tính giờ đầu tiên: thêm dòng 'jquery: true' trong tệp .jshintrc của bạn.
genkilabs

3
Lý do cho ": false" là gì? Tôi đã tìm thấy / * toàn cầu $ * / hoạt động tốt. (Trong trường hợp của tôi là / * jQuery toàn cầu * / mặc dù)
Michiel

Có cách nào để thiết lập điều này một cách khái quát cho tất cả các chức năng trong một tập lệnh, thay vì nhập từng cái một /* global ... */không? Tôi thường nhập một tập lệnh với tất cả các chức năng của mình vào mainđó để việc xác định từng tập một trở nên khó khăn ...
tsando

148

Bạn cũng có thể thêm hai dòng vào .jshintrc của mình

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

Điều này nói với jshint rằng có hai biến toàn cục.


3
đây sẽ là câu trả lời được chấp nhận gây ô nhiễm MỌI HÌNH THỨC javascript trong dự án của bạn với nhiều dòng mã khác nhau để làm cho trình kiểm tra cú pháp hài lòng không phải là một tùy chọn. Cảm ơn wmil
Cosmin

51

Tất cả bạn cần làm là thiết lập "jquery": truetrong của bạn .jshintrc.

Theo tham chiếu tùy chọn JSHint :

jquery

Tùy chọn này xác định các quả cầu được hiển thị bởi thư viện jQuery JavaScript.


6
Đây có lẽ nên là câu trả lời hàng đầu ... xấu hổ vì nó bị chôn vùi ở đây
Zach Lysobey

Nơi tìm tệp .jshintrc trong văn bản Sublime 3? Tôi đã cố gắng đặt tùy chọn này trong tệp cài đặt SublimeLinter.sublime (Tùy chọn-> Cài đặt gói-> SublimeLinter-> Cài đặt-Mặc định) và cũng đã thử tạo tệp .jshintrc mới (my.jshintrc) trong thư mục gốc dự án của tôi, theo jshint.com/docs . Không phải điều này đã giúp tôi.
Milos

@Milos Cài đặt Máng xối JSHint trong sublimetext 3. Chuyển đến Công cụ> JSHint> Đặt tùy chọn Linting, Nó sẽ mở .jshintrc.
niren

1
Không có gì nữa, nó vẫn không thể nhận ra dấu "$". Khi tôi mở .jshintrc, nó nằm trên đường dẫn: \ AppData \ Roaming \ Sublime Text 3 \ Gói \ JSHint Gutter, tôi đặt "jquery": đúng và không có gì xảy ra.
Milos

Câu trả lời tốt hơn nhiều so với việc thêm các biến vào phần toàn cầu! Giải quyết nó theo cách này!
Matthias Kleine

16

Đây là một danh sách nhỏ hạnh phúc để đưa vào .jshintrc của bạn,
tôi sẽ thêm vào danh sách này vào thời gian qua.

{
  // 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
Nếu bạn đặt tùy chọn "trình duyệt" và "nút" thành "true", các mục duy nhất còn lại trong danh sách này là cần thiết là $, jquery và angular. Để biết thêm thông tin, hãy xem phần Môi trường của các tài liệu: jshint.com/docs/options/#envirments
user456584

Tôi đã chỉnh sửa câu trả lời để bao gồm cập nhật của bạn, cảm ơn bạn @ user456584
James Harrington

8

Nếu bạn đang sử dụng trình soạn thảo IntelliJ như WebStorm, PyCharm, RubyMine hoặc IntelliJ IDEA:

Trong phần Môi trường của Tệp / Cài đặt / JavaScript / Công cụ chất lượng mã / JSHint, nhấp vào hộp kiểm jQuery.


1
Cũng chú ý rằng bạn có thể ghi đè tất cả các cấu hình bên trong bằng cách chọn "sử dụng tệp cấu hình". Điều này sẽ làm cho WS thấy các sửa đổi tệp cấu hình. Không có nó anh chỉ mặc kệ nó.
neoswf

3

Thay vì khuyến nghị "tắt toàn cầu JSHint" thông thường, tôi khuyên bạn nên sử dụng mẫu mô-đun để khắc phục sự cố này. Nó giữ mã của bạn "được chứa" và tăng hiệu suất (dựa trên "10 điều tôi học được về Jquery" của Paul Irish ).

Tôi có xu hướng viết các mô-đun mô-đun của tôi như thế này:

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

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

Bạn có thể nhận được những lợi ích hiệu suất khác (giải thích thêm tại đây ):

  • Khi thu nhỏ mã, thông windowbáo khai báo đối tượng cũng được rút gọn. ví dụ window.alert()trở thành m.alert().
  • Mã bên trong hàm ẩn danh tự thực thi chỉ sử dụng 1 thể hiện của windowđối tượng.
  • Bạn cắt theo đuổi khi gọi một thuộc windowtính hoặc phương thức, ngăn chặn việc truyền tải đắt tiền của chuỗi phạm vi, ví dụ window.alert()(nhanh hơn) so với alert()(chậm) hiệu suất.
  • Phạm vi chức năng cục bộ thông qua "không gian tên" và ngăn chặn (toàn cầu là xấu xa). Nếu bạn cần chia mã này thành các tập lệnh riêng biệt, bạn có thể tạo một mô hình con cho mỗi tập lệnh đó và nhập chúng vào một mô-đun chính.

2
Đây là một mẫu tôi cũng sử dụng, nhưng nó không giải quyết được vấn đề ban đầu cho tôi. JSHint vẫn phàn nàn rằng một biến không được xác định ở dòng cuối cùng ( "}(window))"trong ví dụ của bạn - tôi cũng gặp vấn đề với jQuery và Highcharts). Tôi chưa tìm ra cách nào để tắt nó ngoài việc xác định toàn cầu cho tệp, mà sau đó đánh bại mục đích.
myrosia

@myrosia browser: truenói với JSHint rằng bạn mong đợi một môi trường trình duyệt (nơi windowđã được xác định).
sam

Tôi thích cách tiếp cận này!
jethroo

2

Nếu bạn đang sử dụng trình soạn thảo IntelliJ, bên dưới

  • Tùy chọn / Cài đặt
    • Javascript
      • Mã công cụ chất lượng
        • Mã não
          • Được xác định trước (ở dưới cùng), nhấp vào Đặt

Ví dụ console:false, bạn có thể nhập bất cứ thứ gì và nó sẽ thêm nó vào danh sách (.jshintrc) - dưới dạng toàn cục.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.