JSLint รายงานโดยฉับพลัน: ใช้รูปแบบฟังก์ชั่นของ“ use เข้มงวด”


930

ฉันรวมถึงคำสั่ง:

"use strict";

ที่จุดเริ่มต้นของไฟล์ Javascript ของฉันส่วนใหญ่

JSLint ไม่เคยเตือนมาก่อนเกี่ยวกับเรื่องนี้ แต่ตอนนี้มันพูดว่า:

ใช้รูปแบบฟังก์ชั่นของ "ใช้เข้มงวด"

ไม่มีใครรู้ว่า "รูปแบบฟังก์ชั่น" จะเป็นอย่างไร

คำตอบ:


1010

รวม'use strict';เป็นคำสั่งแรกในฟังก์ชันการตัดคำดังนั้นจะมีผลกับฟังก์ชันนั้นเท่านั้น วิธีนี้จะช่วยป้องกันปัญหาเมื่อเชื่อมสคริปต์ที่ไม่เข้มงวด

บล็อกโพสต์ล่าสุดดูดักลาส Crockford ของเข้มงวดโหมดจะมาถึงเมือง

ตัวอย่างจากโพสต์นั้น:

(function () {
   'use strict';
   // this function is strict...
}());

(function () {
   // but this function is sloppy...
}());

อัปเดต: ในกรณีที่คุณไม่ต้องการห่อในฟังก์ชั่นทันที (เช่นเป็นโมดูลโหนด) จากนั้นคุณสามารถปิดการเตือน

สำหรับJSLint (ต่อZhami ):

/*jslint node: true */

สำหรับJSHint :

/*jshint strict:false */

หรือ (ต่อLaith Shadeed )

/* jshint -W097 */

หากต้องการปิดใช้งานคำเตือนใด ๆ จาก JSHint ให้ตรวจสอบแผนที่ในซอร์สโค้ด JSHint (รายละเอียดในเอกสาร )

อัปเดต 2: JSHintรองรับnode:booleanตัวเลือก ดู.jshintrcที่ GitHub

/* jshint node: true */

1
ใน JSLint สำหรับ Visual Studio เป็นตัวเลือก: "อนุญาตให้ใช้ ES5 ทั่วโลกที่เข้มงวด"
Jowen

10
สิ่งนี้ไม่สมเหตุสมผลสำหรับแอ็พพลิเคชันโหนด -1
bevacqua

1
สวัสดีนิโก้ฉันได้อัปเดตคำตอบสำหรับโหนดที่คุณสามารถพิมพ์: / * jshint -W097 * / เพื่อปิดใช้งานคำเตือนนี้
Laith Shadeed

@LaithShadeed ทางเลือกที่จะ/*jshint strict:false */ที่จะทำให้มันชัดเจนสิ่งที่คุณทำ (ยกเว้นกรณีที่มีประโยชน์โดยเฉพาะรหัสตัวเลขของคุณว่าผมไม่ทราบ)
bdukes

2
@Noumenon มันไม่ใช่ต้นแบบจริง ๆ เป็นคำสั่งที่เปลี่ยนสภาพแวดล้อมที่รหัสของคุณกำลังทำงานอยู่นั่นคือไวยากรณ์ ES6 ใหม่ (โมดูลและคลาส) นั้นเข้มงวดโดยค่าเริ่มต้น (ดูecma-international.org/ecma-262/6.0/ # sec-เข้มงวด-mode-code ) ดังนั้นการทำสิ่งต่อไปนี้ไม่จำเป็นต้องทิ้งให้เกลื่อนกลาดในทุกที่ ในระหว่างนี้คุณสามารถรวมโค้ดทั้งหมดในIIFEได้โดยจะต้องระบุ"use strict";หนึ่งครั้งต่อไฟล์
bdukes

217

หากคุณกำลังเขียนโมดูลสำหรับ NodeJS พวกเขาจะถูกห่อหุ้มแล้ว บอก JSLint ว่าคุณมีโหนดโดยรวมที่ด้านบนของไฟล์ของคุณ:

/*jslint node: true */

2
FYI ตัวเลือกนี้ใช้ได้กับ JSLint แต่ JSHint ไม่ได้ปิดการเตือนความเข้มงวดด้วยคำสั่งนี้ สำหรับ JSHint ให้ลอง/*jshint strict:false */
bdukes

4
พูดกับฉันด้วย JSHint v2.9.2 เพิ่มไว้"node": trueใน. jshintrc
RyanM

71

ฉันแนะนำให้ใช้jshintแทน

/*jshint globalstrict: true*/จะช่วยให้การปราบปรามคำเตือนนี้ผ่านทาง

หากคุณกำลังเขียนไลบรารีฉันจะแนะนำให้ใช้ระดับโลกเท่านั้นหากรหัสของคุณถูกห่อหุ้มในโมดูลเช่นเดียวกับกรณีที่มี nodejs

มิฉะนั้นคุณจะบังคับให้ทุกคนที่ใช้ห้องสมุดของคุณเข้าสู่โหมดเข้มงวด



4
FYI: ตัวเลือก globalstrict ใน JSHint มีการเปลี่ยนแปลง ลองstrict: 'global'ตอนนี้และดูjshint.com/docs/options/#globalstrict
Hovis Biddle

17

ฉันเริ่มสร้างแอปพลิเคชัน Node.js / เบราว์เซอร์หลังจากโพสต์บล็อกข้ามแพลตฟอร์ม JavaScript และฉันพบปัญหานี้เพราะ Gruntfile ใหม่ของฉันไม่ผ่าน jshint

โชคดีที่ฉันพบคำตอบในหนังสือ Leanpub บน Grunt :

หากเราลองตอนนี้เราจะสแกน Gruntfile ของเรา…และรับข้อผิดพลาด:

$ grunt jshint

Running "jshint:all" (jshint) task
Linting Gruntfile.js...ERROR
[L1:C1] W097: Use the function form of "use strict".
'use strict';
Linting Gruntfile.js...ERROR
[L3:C1] W117: 'module' is not defined.
module.exports = function (grunt) {

Warning: Task "jshint:all" failed. Use --force to continue.

ข้อผิดพลาดทั้งสองเป็นเพราะ Gruntfile เป็นโปรแกรม Node และโดยค่าเริ่มต้น JSHint ไม่รู้จักหรืออนุญาตให้ใช้และรุ่นสตริงของmodule use strictเราสามารถตั้งกฎ JSHint ที่จะยอมรับโปรแกรมโหนดของเรา มาแก้ไขการกำหนดค่างาน jshint ของเราและเพิ่มปุ่มตัวเลือก:

jshint: {
  options: {
    node: true
  },
}

การเพิ่มnode: truejshint optionsเพื่อใส่ jshint ใน "โหมดโหนด" ลบข้อผิดพลาดทั้งสองสำหรับฉัน


16

เพิ่มไฟล์. jslintrc (หรือ. jshintrc ในกรณีของ jshint) ที่รูทของโปรเจ็กต์ของคุณด้วยเนื้อหาต่อไปนี้:

{
    "node": true
}

15

ไม่มีอะไรผิดปกติกับรูปแบบสตริง

แทนที่จะหลีกเลี่ยงรูปแบบที่เข้มงวด "ทั่วโลก" เนื่องจากความกังวลในการเชื่อมต่อจาวาสคริปต์ที่ไม่เข้มงวดมันน่าจะดีกว่าที่จะแก้ไขจาวาสคริปต์ที่ไม่เข้มงวดเพื่อให้เข้มงวด


0

ฉันคิดว่าทุกคนพลาดส่วน "ทันใด" ของคำถามนี้ เป็นไปได้มากว่า. jshintrc ของคุณมีข้อผิดพลาดทางไวยากรณ์ดังนั้นจึงไม่รวมบรรทัด 'เบราว์เซอร์' รันผ่านตัวตรวจสอบ json เพื่อดูว่าข้อผิดพลาดอยู่ที่ไหน


1
ไม่เกิดขึ้นทันทีทันใดเพราะบริการ JSLint ออนไลน์เพิ่มคุณลักษณะนั้นในปี 2010 เมื่อมีคำถามถาม
เควนติน

0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

เพิ่มบรรทัดนี้ไปที่จุดเริ่มต้นของไฟล์ของคุณ


-4

นี่คือความง่าย: ถ้าคุณต้องการเข้มงวดกับรหัสทั้งหมดของคุณเพิ่ม"use strict";ที่จุดเริ่มต้นของ JavaScript ของคุณ

แต่ถ้าคุณต้องการเข้มงวดกับรหัสของคุณให้ใช้แบบฟอร์มฟังก์ชั่น อย่างไรก็ตามฉันจะแนะนำให้คุณใช้มันที่จุดเริ่มต้นของ JavaScript ของคุณเพราะสิ่งนี้จะช่วยให้คุณเป็น coder ที่ดีขึ้น


8
ฉันได้รับข้อผิดพลาดนี้จริง ๆ เมื่อฉันวาง"use strict";ที่ด้านบนของไฟล์ JS ของฉันเท่านั้นดังนั้นสิ่งนี้อาจไม่เป็นจริงทั้งหมด
moesef

@moesef นั่นเป็นเพราะคุณมีข้อผิดพลาดในรหัสของคุณ มีไว้เพื่อช่วยพัฒนาทักษะการเขียนโค้ดของคุณให้ดีขึ้นและทำให้โค้ดของคุณน้อยลง "หลวม" ... มันจะไม่ยอมรับตัวแปรที่ไม่ได้ประกาศ ฯลฯ ...
Jason Stackhouse

11
@ JasonStackhouse: ไม่จริง JSLint จะไม่ยอมรับรูปแบบ "ทั่วโลก" "use strict";ซึ่งจะอยู่ที่ด้านบนสุดของรหัสของคุณ มันช่วยให้"use strict;"เมื่อห่อในฟังก์ชั่นเท่านั้น (JS_Hint_ ช่วยให้คุณสามารถใช้แบบฟอร์มทั่วโลก - ดูคำตอบข้างต้นสำหรับการตั้งค่าที่จำเป็น)
peterflynn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.