JSLint đang báo cáo đột ngột: Sử dụng hình thức chức năng của sử dụng nghiêm ngặt


930

Tôi bao gồm các tuyên bố:

"use strict";

ở phần đầu của hầu hết các tệp Javascript của tôi.

JSLint chưa bao giờ cảnh báo về điều này. Nhưng bây giờ, nó nói:

Sử dụng hình thức chức năng của "sử dụng nghiêm ngặt".

Có ai biết "hình thức chức năng" sẽ là gì không?

Câu trả lời:


1010

Bao gồm 'use strict';như là câu lệnh đầu tiên trong hàm gói, vì vậy nó chỉ ảnh hưởng đến hàm đó. Điều này ngăn ngừa các vấn đề khi ghép các tập lệnh không nghiêm ngặt.

Xem bài đăng trên blog mới nhất của Douglas Crockford Chế độ nghiêm ngặt sẽ đến thị trấn .

Ví dụ từ bài đăng đó:

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

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

Cập nhật: Trong trường hợp bạn không muốn bọc chức năng ngay lập tức (ví dụ: đây là mô-đun nút), thì bạn có thể tắt cảnh báo.

Đối với JSLint (mỗi Zhami ):

/*jslint node: true */

Đối với JSHint :

/*jshint strict:false */

hoặc (theo Laith Shadeed )

/* jshint -W097 */

Để vô hiệu hóa bất kỳ cảnh báo tùy ý nào từ JSHint, hãy kiểm tra bản đồ trong mã nguồn JSHint (chi tiết trong tài liệu ).

Cập nhật 2: Tùy chọn hỗ trợ JSHintnode:boolean . Xem .jshintrctại github .

/* jshint node: true */

1
Trong JSLint cho Visual Studio, tùy chọn: "Cho phép nghiêm ngặt ES5 toàn cầu"
Jowen

10
Điều này không có ý nghĩa đối với các ứng dụng Node. -1
bevacqua

1
Xin chào, tôi đã cập nhật câu trả lời, cho nút bạn có thể gõ: / * jshint -W097 * / để tắt cảnh báo này
Laith Shadeed

@LaithShadeed Một giải pháp thay thế sẽ là /*jshint strict:false */, để làm rõ hơn những gì bạn đang làm (trừ khi có một lợi ích cụ thể cho mã số của bạn mà tôi không biết)
bdukes

2
@Noumenon nó không thực sự sôi nổi, đó là một lệnh thay đổi môi trường mà mã của bạn đang chạy. Điều đó nói rằng, cú pháp ES6 mới (các mô-đun và lớp) theo mặc định là nghiêm ngặt (xem ecma-i Intl.org/ecma-262/6.0/ # sec -rict-mode-code ), vì vậy, về phía trước điều này sẽ không cần phải xả rác ở mọi nơi. Trong khi đó, bạn có thể bọc tất cả mã của mình trong IIFE để chỉ phải chỉ định "use strict";một lần cho mỗi tệp.
bdukes

217

Nếu bạn đang viết các mô-đun cho NodeJS, chúng đã được gói gọn. Nói với JSLint rằng bạn đã có nút bằng cách đưa vào đầu tệp của bạn:

/*jslint node: true */

2
FYI, tùy chọn này hoạt động cho JSLint, nhưng JSHint không tắt cảnh báo nghiêm ngặt với chỉ thị này. Đối với JSHint, thử/*jshint strict:false */
bdukes

4
Đã thông báo cho tôi với JSHint v2.9.2. Đã thêm vào "node": true.jshintrc
RyanM

71

Tôi muốn đề nghị sử dụng jshint thay thế.

Nó cho phép triệt tiêu cảnh báo này thông qua /*jshint globalstrict: true*/.

Nếu bạn đang viết một thư viện, tôi sẽ chỉ đề xuất sử dụng toàn cầu nghiêm ngặt nếu mã của bạn được gói gọn trong các mô-đun như trường hợp với nodejs.

Nếu không, bạn sẽ buộc tất cả những người đang sử dụng thư viện của bạn vào chế độ nghiêm ngặt.



4
FYI: Tùy chọn globalstrict trong JSHint đã thay đổi. Hãy thử strict: 'global'ngay bây giờ và xem jshint.com/docs/options/#globalstrict
Hovis Biddle

17

Tôi đã bắt đầu tạo một ứng dụng Node.js / browserify sau bài đăng trên blog Cross Platform JavaScript . Và tôi gặp phải vấn đề này, bởi vì Gruntfile hoàn toàn mới của tôi đã không vượt qua jshint.

May mắn thay tôi đã tìm thấy một câu trả lời trong cuốn sách Leanpub về Grunt :

Nếu chúng tôi thử ngay bây giờ, chúng tôi sẽ quét Gruntfile của chúng tôi và nhận được một số lỗi:

$ 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.

Cả hai lỗi là do Gruntfile là một chương trình Node và theo mặc định, JSHint không nhận ra hoặc cho phép sử dụng modulevà phiên bản chuỗi của use strict. Chúng ta có thể đặt quy tắc JSHint sẽ chấp nhận các chương trình Node của chúng ta. Hãy chỉnh sửa cấu hình tác vụ jshint của chúng tôi và thêm khóa tùy chọn:

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

Thêm node: truevào jshint options, để đưa jshint vào "Chế độ nút", đã loại bỏ cả hai lỗi cho tôi.


16

Thêm một tệp .jslintrc (hoặc .jshintrc trong trường hợp jshint) ở thư mục gốc của dự án của bạn với nội dung sau:

{
    "node": true
}

15

Không có gì sai hoàn toàn với dạng chuỗi.

Thay vì tránh hình thức nghiêm ngặt "toàn cầu" vì lo lắng về việc kết hợp các javascript không nghiêm ngặt, có lẽ tốt hơn là chỉ sửa lỗi javascript không nghiêm ngặt chết tiệt thành nghiêm ngặt.


0

Tôi nghĩ rằng tất cả mọi người đã bỏ lỡ phần "đột nhiên" của câu hỏi này. Rất có thể, .jshintrc của bạn có lỗi cú pháp, do đó, nó không bao gồm dòng 'trình duyệt'. Chạy nó thông qua trình xác nhận json để xem lỗi ở đâu.


1
Không, nó bất ngờ xảy ra vì dịch vụ JSLint trực tuyến đã thêm tính năng đó vào năm 2010 khi câu hỏi được hỏi.
Quentin

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

thêm dòng này vào điểm bắt đầu của tập tin của bạn


-4

Đây là cách đơn giản: Nếu bạn muốn nghiêm ngặt với tất cả mã của mình, hãy thêm "use strict";vào lúc bắt đầu JavaScript.

Nhưng nếu bạn chỉ muốn nghiêm ngặt với một số mã của mình, hãy sử dụng mẫu hàm. Dù sao đi nữa, tôi khuyên bạn nên sử dụng nó khi bắt đầu JavaScript bởi vì điều này sẽ giúp bạn trở thành một lập trình viên giỏi hơn.


8
Tôi thực sự gặp lỗi này khi tôi chỉ đặt "use strict";ở đầu tệp JS của mình, vì vậy điều này có thể không hoàn toàn đúng.
moesef

@moesef Đó là vì bạn có lỗi trong mã của mình. Nó chỉ ở đó để giúp làm cho kỹ năng mã hóa của bạn tốt hơn và làm cho mã của bạn bớt "lỏng lẻo" hơn ... nó sẽ không chấp nhận các biến không được khai báo, v.v ...
Jason Stackhouse

11
@JasonStackhouse: Không đúng. JSLint sẽ không chấp nhận hình thức "toàn cầu" "use strict";, nơi nó chỉ được đặt ở đầu mã của bạn. Nó chỉ cho phép "use strict;"khi được bọc trong một chức năng. (Tuy nhiên, JS_Hint_ cho phép bạn sử dụng biểu mẫu chung - xem câu trả lời ở trên để biết cài đặt cần thiết).
peterflynn
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.