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ไปยังหน้าของคุณหรือไม่
Rory McCrossan

4
ถ้าคุณป้อนเพียงรหัสนั้นเองมัน$ ก็ไม่ได้ถูกกำหนด
Pointy

ฉันมีปัญหานี้เป็นมุม เพียงแค่เปลี่ยน $ เป็น angular.element และ jshint ไม่เตือน
Raphael Vitor

คำตอบ:


381

หากคุณกำลังใช้ JSHint เวอร์ชันล่าสุดแนวทางที่ต้องการโดยทั่วไปคือการสร้างไฟล์. jshintrc ในรูทโครงการของคุณและกำหนดค่านี้ไว้:

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

สิ่งนี้ประกาศให้ JSHint ทราบว่า $ เป็นตัวแปรทั่วโลกและเท็จระบุว่าไม่ควรเขียนทับ

ไฟล์. jshintrc ไม่ได้รับการสนับสนุนใน JSHint เวอร์ชันเก่าจริง ๆ (เช่น v0.5.5 เช่นคำถามเดิมในปี 2012) หากคุณไม่สามารถหรือไม่ต้องการใช้ไฟล์. jshintrc คุณสามารถเพิ่มไฟล์นี้ที่ด้านบนของไฟล์สคริปต์:

/*globals $:false */

นอกจากนี้ยังมีตัวเลือก jshint "jquery" แบบย่อตามที่เห็นในหน้าตัวเลือก JSHint ..


47
ตัวเลือกนี้ jquery เพียงกำหนดตัวแปรโกลบอลแบบอ่านอย่างเดียวสองตัวคือ $ และ jQuery /*global $:false, jQuery:false */มันเป็นรุ่นสั้น
Anton Kovalyov

1
ด้วย JSHint ของฉันสำหรับ Visual Studio ตัวเลือกนี้ถูกเรียกว่า "สมมติว่า jQuery"
Jowen

2
การตั้งค่าสถานะตัวเลือกเป็นวิธีที่จะดำเนินการสำหรับตัวนับแรก: เพิ่มบรรทัด 'jquery: true' ในไฟล์. jshintrc ของคุณ
genkilabs

3
อะไรคือสาเหตุของ ": false" ฉันพบ / * global $ * / ใช้งานได้ดี (ในกรณีของฉันคือ / * ทั่วโลก jQuery * / แม้ว่า)
Michiel

มีวิธีการตั้งค่านี้โดยทั่วไปสำหรับฟังก์ชั่นทั้งหมดภายในสคริปต์แทนที่จะพิมพ์ทีละหนึ่งใน/* global ... */? ฉันมักจะนำเข้าสคริปต์ที่มีฟังก์ชั่นทั้งหมดของฉันเป็นของฉันmainดังนั้นมันจึงเป็นเรื่องยากที่จะกำหนดทีละ ...
tsando

148

คุณยังสามารถเพิ่มสองบรรทัดใน. jshintrc ของคุณ

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

สิ่งนี้บอก jshint ว่ามีตัวแปรโกลบอลสองตัว


3
นี่ควรเป็นคำตอบที่ยอมรับได้ การทำให้สกปรกทุกครั้ง javascript FILE ในโครงการของคุณด้วยโค้ดหลายบรรทัดเพื่อให้ตัวตรวจสอบไวยากรณ์มีความสุขไม่ใช่ตัวเลือก ขอบคุณ wmil
Cosmin

51

ทั้งหมดที่คุณต้องทำคือการตั้งในของคุณ"jquery": true.jshintrc

ตามการอ้างอิงตัวเลือก JSHint :

jQuery

ตัวเลือกนี้กำหนด globals ที่เปิดเผยโดยไลบรารี jQuery JavaScript


6
นี่น่าจะเป็นคำตอบที่ดีที่สุด ... ความอับอายมันถูกฝังอยู่ที่นี่
Zach Lysobey

จะหาไฟล์. jshintrc ใน Sublime text 3 ได้จากที่ไหน? ฉันพยายามใส่ตัวเลือกนี้ในไฟล์ SublimeLinter.sublime-settings (Preferences-> Package Settings-> SublimeLinter-> Settings-Default) และพยายามสร้างไฟล์. jshintrc ใหม่ (my.jshintrc) ในไดเรกทอรีรากของโครงการของฉันตามjshint.com/docs สิ่งนี้ช่วยฉันไม่ได้
Milos

@Milos ติดตั้ง JSHint Gutter ใน Sublimetext 3. ไปที่เครื่องมือ> JSHint> ตั้งค่า Linting Preferences มันจะเปิด. jshintrc
niren

1
ไม่มีอะไรอีกแล้วมันยังไม่สามารถจดจำเครื่องหมาย "$" ได้ เมื่อฉันเปิด. jshintrc มันอยู่บนเส้นทาง: \ AppData \ Roaming \ Sublime Text 3 \ Packages \ JS คำแนะนำรางน้ำฉันใส่ "jquery": จริงและไม่มีอะไรเกิดขึ้น
Milos

คำตอบที่ดีกว่าการเพิ่มตัวแปรไปยังส่วนกลม! แก้ไขด้วยวิธีนี้!
Matthias Kleine

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
หากคุณตั้งค่าตัวเลือก "เบราว์เซอร์" และ "โหนด" เป็น "จริง" เฉพาะรายการที่เหลือในรายการนี้ที่จำเป็นคือ $, jquery และเชิงมุม สำหรับข้อมูลเพิ่มเติมโปรดดูที่ส่วนสภาพแวดล้อมของเอกสาร: jshint.com/docs/options/#environment
user456584

ฉันได้แก้ไขคำตอบเพื่อรวมการอัปเดตของคุณแล้วขอบคุณ @ user456584
James Harrington

8

หากคุณใช้โปรแกรมแก้ไข IntelliJ เช่น WebStorm, PyCharm, RubyMine หรือ IntelliJ IDEA:

ในส่วนสภาพแวดล้อมของเครื่องมือ / ไฟล์ / การตั้งค่า / JavaScript / รหัสคุณภาพ / JSHint คลิกที่ช่องทำเครื่องหมาย jQuery


1
ให้ความสนใจเช่นกันว่าคุณสามารถแทนที่การกำหนดค่าภายในทั้งหมดได้โดยทำเครื่องหมายที่ "use config file" สิ่งนี้จะทำให้ WS ดูการแก้ไขไฟล์ปรับแต่ง หากปราศจากมันเขาก็จะไม่สนใจมัน
neoswf

3

แทนที่จะแนะนำ "ปิดปกติ JSHint globals" ฉันขอแนะนำให้ใช้รูปแบบโมดูลเพื่อแก้ไขปัญหานี้ มันทำให้รหัสของคุณ "มี" และให้เพิ่มประสิทธิภาพ (ขึ้นอยู่กับพอลไอริช"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()(ช้ากว่า)
  • ขอบเขตของฟังก์ชั่นในท้องถิ่นผ่าน "namespacing" และการบรรจุ (กลมเป็นสิ่งที่ชั่วร้าย) หากคุณต้องการแยกรหัสนี้เป็นสคริปต์แยกคุณสามารถสร้าง submodule สำหรับแต่ละสคริปต์เหล่านั้นและนำเข้ามาไว้ในโมดูลหลักเดียว

2
นี่เป็นรูปแบบที่ฉันใช้เช่นกัน แต่ก็ไม่ได้แก้ปัญหาเดิมสำหรับฉัน JSHint ยังคงบ่นว่าตัวแปรไม่ได้ถูกกำหนดไว้ในบรรทัดสุดท้าย ( "}(window))"ในตัวอย่างของคุณ - ฉันมีปัญหากับ jQuery และ Highcharts) ฉันไม่พบวิธีที่จะปิดการใช้งานอื่น ๆ นอกเหนือจากการกำหนดโกลบอลสำหรับไฟล์ ซึ่งเอาชนะเป้าหมายได้
Myrosia

@myrosia browser: trueบอก JSHint ว่าคุณคาดว่าจะมีสภาพแวดล้อมของเบราว์เซอร์ (ที่windowกำหนดไว้แล้ว)
sam

ฉันชอบวิธีนี้!
jethroo

2

หากคุณกำลังใช้เครื่องมือแก้ไข IntelliJ ภายใต้

  • การตั้งค่า / การตั้งค่า
    • จาวาสคริ
      • เครื่องมือคุณภาพรหัส
        • JSHint
          • กำหนดไว้ล่วงหน้า (ที่ด้านล่าง) คลิกตั้ง

ตัวอย่างเช่นคุณสามารถพิมพ์อะไรก็ได้console:falseและมันจะเพิ่มสิ่งนั้นลงในรายการ (.jshintrc) เช่นเดียวกับทั่วโลก



0

คุณอาจต้องการทำสิ่งต่อไปนี้

const $ = window.$

เพื่อหลีกเลี่ยงการโยนข้อผิดพลาดที่เป็นขุย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.