Những gì người dùng sử dụng nghiêm ngặt, làm gì trong JavaScript, và lý do đằng sau nó là gì?


7549

Gần đây, tôi đã chạy một số mã JavaScript của mình thông qua JSLint của Crockford và nó đã báo lỗi sau:

Vấn đề ở dòng 1 ký tự 1: Thiếu câu lệnh "sử dụng nghiêm ngặt".

Thực hiện một số tìm kiếm, tôi nhận ra rằng một số người thêm "use strict";vào mã JavaScript của họ. Khi tôi thêm câu lệnh, lỗi dừng xuất hiện. Thật không may, Google đã không tiết lộ nhiều lịch sử đằng sau tuyên bố chuỗi này. Chắc chắn nó phải có một cái gì đó để làm với cách JavaScript được trình duyệt diễn giải, nhưng tôi không biết hiệu ứng sẽ như thế nào.

Vì vậy, "use strict";tất cả những gì về nó, nó ngụ ý gì, và nó vẫn còn liên quan?

Có bất kỳ trình duyệt hiện tại phản ứng với "use strict";chuỗi hoặc nó sẽ được sử dụng trong tương lai?


5
Các câu trả lời ở đây đã cũ nhưng chúng sai. Lý do chính cho chế độ nghiêm ngặt không phải là để ngăn ngừa lỗi lập trình - đó là làm cho JavaScript có phạm vi từ vựng để có thể phân tích tĩnh:]
Benjamin Gruenbaum

@BenjaminGruenbaum Sử dụng "use strict";một mình không làm cho JS có phạm vi từ vựng. Khai báo các biến có letconstnên được sử dụng quá.
Koorosh Pasokhi

Bạn đang trộn lẫn giữa phạm vi khối và phạm vi từ vựng.
Benjamin Gruenbaum

Câu trả lời:


4938

Bài viết này về Chế độ nghiêm ngặt Javascript có thể khiến bạn quan tâm: John Resig - Chế độ nghiêm ngặt ECMAScript 5, JSON và hơn thế nữa

Để trích dẫn một số phần thú vị:

Chế độ nghiêm ngặt là một tính năng mới trong ECMAScript 5 cho phép bạn đặt một chương trình hoặc một chức năng trong bối cảnh hoạt động "nghiêm ngặt". Bối cảnh nghiêm ngặt này ngăn chặn một số hành động nhất định được thực hiện và ném thêm ngoại lệ.

Và:

Chế độ nghiêm ngặt giúp một vài cách:

  • Nó bắt một số blooper mã hóa phổ biến, ném ngoại lệ.
  • Nó ngăn chặn hoặc ném lỗi, khi các hành động tương đối "không an toàn" được thực hiện (chẳng hạn như giành quyền truy cập vào đối tượng toàn cầu).
  • Nó vô hiệu hóa các tính năng gây nhầm lẫn hoặc suy nghĩ kém.

Cũng lưu ý rằng bạn có thể áp dụng "chế độ nghiêm ngặt" cho toàn bộ tệp ... Hoặc bạn chỉ có thể sử dụng nó cho một chức năng cụ thể (vẫn trích dẫn từ bài viết của John Resig) :

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

Điều này có thể hữu ích nếu bạn phải trộn mã cũ và mã mới ;-)

Vì vậy, tôi cho rằng nó hơi giống với những "use strict"gì bạn có thể sử dụng trong Perl (vì vậy tên?) : Nó giúp bạn ít mắc lỗi hơn, bằng cách phát hiện thêm nhiều thứ có thể dẫn đến vỡ.

Chế độ nghiêm ngặt hiện được hỗ trợ bởi tất cả các trình duyệt chính .

Bên trong các mô-đun ECMAScript gốc (có importvà các exportcâu lệnh) và các lớp ES6 , chế độ nghiêm ngặt luôn được bật và không thể bị tắt.


100
Thay đổi mặc định sau bao nhiêu năm? Quá muộn cho điều đó: nó sẽ phá vỡ rất nhiều trang web / tập lệnh / ứng dụng hiện có ... Điều duy nhất có thể là giúp mọi thứ tốt hơn, cho tương lai.
Pascal MARTIN

14
Tôi đã thử một đoạn mã nhỏ sẽ không hợp lệ khi sử dụng "use strict"trong Firefox 3.6, Safari 5, Chrome 7 và Opera 10.6 (tất cả máy Mac). Không có lỗi gì, vì vậy tôi đoán 'sử dụng nghiêm ngặt' chưa được hỗ trợ trong bất kỳ trình duyệt nào. Chưa thử nghiệm trên IE9;)
Husky

11
Cập nhật nhanh: Firefox 4 đã hỗ trợ đầy đủ cho chế độ nghiêm ngặt và theo như tôi có thể nói, không có trình duyệt nào khác làm được. Safari và Chrome có hỗ trợ "một phần", nhưng tôi không thực sự biết điều đó có nghĩa là gì.
Sasha Chedygov

29
Chrome 11 dường như vượt qua tất cả các thử nghiệm này cũng như IE10 tức là.microsoft.com/testdrive/HTML5/TryStrict/Default.html
gman

12
@Julius - Điều này không thể được thực hiện bằng cách sử dụng một từ khóa dành riêng, bởi vì sau đó mã cố gắng kích hoạt chế độ nghiêm ngặt sẽ phá vỡ trong các trình duyệt cũ. Thêm một chuỗi "ngẫu nhiên" theo nghĩa đen sẽ không phá vỡ bất cứ điều gì.
nnnnnn

1245

Đây là một tính năng mới của ECMAScript 5. John Resig đã viết lên một bản tóm tắt hay về nó.

Đó chỉ là một chuỗi bạn đặt trong các tệp JavaScript của mình (ở đầu tệp hoặc bên trong hàm) trông giống như sau:

"use strict";

Đặt mã vào mã của bạn bây giờ không nên gây ra bất kỳ vấn đề nào với các trình duyệt hiện tại vì đây chỉ là một chuỗi. Nó có thể gây ra vấn đề với mã của bạn trong tương lai nếu mã của bạn vi phạm pragma. Chẳng hạn, nếu bạn hiện có foo = "bar"mà không xác định footrước, mã của bạn sẽ bắt đầu thất bại ... đó là một điều tốt theo quan điểm của tôi.


328
Thất bại nhanh và thất bại lớn tiếng.
Niels Bom

31
Nếu bạn đang viết Javascript nội tuyến trong các tệp HTML, hãy bắt đầu mỗi khối mới với <script>"use strict";. Cờ chỉ áp dụng cho khối mà nó được bao gồm.
tộc

7
Thật buồn cười, điều này dẫn đến chuỗi phải có dấu ngoặc đơn. Vì vậy, hãy viết 'use strict';thay
nilsi

1
Vậy thì điều gì sẽ xảy ra với khái niệm nâng cao của javascript?
Sunil Sharma

1
@SunilSharma Nếu bạn cố gắng nâng, nhưng không thành công vì biến không được xác định, tại thời điểm này, nó sẽ thêm nó vào đối tượng toàn cầu. Với "use strict";, nó sẽ thất bại thay thế. Điều này có ý nghĩa hơn, bởi vì nếu nó thêm nó vào đối tượng toàn cầu, điều đó có nghĩa là nó có thể không hoạt động vào lần tới khi bạn chạy chức năng / làm một cái gì đó khác đặt lại khối, vì nó sẽ ở khối cao nhất (toàn cầu).
wizzwizz4

646

Tuyên bố "use strict";hướng dẫn trình duyệt sử dụng chế độ Nghiêm, đây là bộ tính năng giảm và an toàn hơn của JavaScript.

Danh sách các tính năng (không đầy đủ)

  1. Không cho phép các biến toàn cầu. (Bắt các varkhai báo và lỗi chính tả trong tên biến)

  2. Bài tập không thành công sẽ ném lỗi trong chế độ nghiêm ngặt (bài tập NaN = 5;)

  3. Nỗ lực xóa các thuộc tính không thể xóa được sẽ ném ( delete Object.prototype)

  4. Yêu cầu tất cả các tên thuộc tính trong một đối tượng bằng chữ là duy nhất ( var x = {x1: "1", x1: "2"})

  5. Tên tham số hàm phải là duy nhất ( function sum (x, x) {...})

  6. Cấm cú pháp bát phân ( var x = 023;một số nhà phát triển giả định rằng số 0 đứng trước không có gì thay đổi số.)

  7. Cấm withtừ khóa

  8. eval trong chế độ nghiêm ngặt không giới thiệu các biến mới

  9. Cấm xóa tên đơn giản ( delete x;)

  10. Cấm ràng buộc hoặc gán tên evalargumentsdưới mọi hình thức

  11. Chế độ nghiêm ngặt không bí danh các thuộc tính của argumentsđối tượng với các tham số chính thức. (tức là trong function sum (a,b) { return arguments[0] + b;}Điều này hoạt động vì arguments[0]bị ràng buộc avà vân vân.)

  12. arguments.callee không được hỗ trợ

[Tham khảo: Chế độ nghiêm ngặt , Mạng lưới nhà phát triển Mozilla ]


40
Nit: biến toàn cục được cho phép, chỉ cần phải rõ ràng (ví dụ window.foo = bar).
gcampbell

1
Yêu cầu tất cả các tên thuộc tính trong một đối tượng bằng chữ là duy nhất (var x = {x1: "1", x1: "2"}) là hợp lệ
Arun Killu

4
Ví dụ của bạn trong 11 thiếu một sửa đổi của một (nếu không nó không có ý nghĩa). I E. hàm tổng (a, b) {a = 0; đối số trả về [0] + b; } alert (sum (1, 2)) sẽ trả về 3 với chế độ nghiêm ngặt và 2 không có chế độ nghiêm ngặt, do bí danh.
David Gausmann

413

Nếu mọi người lo lắng về việc sử dụng use strictnó có thể đáng để kiểm tra bài viết này:

ECMAScript 5 'Hỗ trợ chế độ nghiêm ngặt' trong các trình duyệt. Điều đó có nghĩa là gì?
NovoGeek.com - weblog của Krishna

Nó nói về hỗ trợ trình duyệt, nhưng quan trọng hơn là làm thế nào để đối phó với nó một cách an toàn:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

116
Tôi không đồng ý. Tôi nghĩ rằng điều này cho thấy tại sao nó rất hữu ích. Về bản chất, điều đó có nghĩa là điều này trả về chức năng của nó chứ không phảiwindow
Jamie Hutber

36
Khi nào bạn muốn có cửa sổ thismà bạn không thể nhắm mục tiêu window?
Jamie Hutber

14
Nó đề cập đến chính nó. thisthuộc về chức năng riêng của nó chứ không phải cửa sổ toàn cầu
Jamie Hutber

26
Trong cái thứ hai là thismột undefined.
Broxzier

14
Vấn đề là chương trình JS của bạn sẽ bắt đầu thất bại do truy cập vào một thuộc tính không xác định, thay vì âm thầm làm điều sai trái trên đối tượng toàn cầu. Làm cho việc theo dõi xuống các lỗi tinh tế dễ dàng hơn nhiều.
Stephen Chung

208

Một lời cảnh báo, tất cả các lập trình viên khó tính của bạn: áp dụng "use strict"cho mã hiện tại có thể nguy hiểm! Điều này không phải là một số nhãn dán vui vẻ, vui vẻ mà bạn có thể tát vào mã để làm cho nó 'tốt hơn'. Với "use strict"pragma, trình duyệt sẽ đột nhiên xuất hiện các ngoại lệ ở những nơi ngẫu nhiên mà nó chưa bao giờ ném trước đó chỉ vì tại thời điểm đó, bạn đang làm một cái gì đó mà JavaScript mặc định / lỏng lẻo cho phép nhưng những tác giả JavaScript nghiêm ngặt! Bạn có thể có các vi phạm nghiêm ngặt ẩn trong các cuộc gọi hiếm khi được sử dụng trong mã của bạn, điều này sẽ chỉ tạo ra một ngoại lệ khi cuối cùng chúng được chạy - giả sử, trong môi trường sản xuất mà khách hàng trả tiền của bạn sử dụng!

Nếu bạn chuẩn bị đi sâu, thì nên áp dụng "use strict"cùng với các bài kiểm tra đơn vị toàn diện và một nhiệm vụ xây dựng JSHint được cấu hình nghiêm ngặt sẽ giúp bạn tự tin rằng không có góc tối nào trong mô-đun của bạn sẽ nổ tung khủng khiếp chỉ vì bạn Đã bật Chế độ nghiêm ngặt. Hoặc, hey, đây là một tùy chọn khác: chỉ cần không thêm "use strict"vào bất kỳ mã kế thừa nào của bạn, có thể an toàn hơn theo cách đó, thành thật mà nói. DEFINITELY KHÔNG thêm "use strict"vào bất kỳ mô-đun nào bạn không sở hữu hoặc duy trì, như các mô-đun của bên thứ ba.

Tôi nghĩ mặc dù nó là một con vật bị nhốt chết người, "use strict"có thể là thứ tốt, nhưng bạn phải làm điều đó đúng. Thời gian tốt nhất để đi nghiêm ngặt là khi dự án của bạn là greenfield và bạn đang bắt đầu lại từ đầu. Định cấu hình JSHint/JSLintvới tất cả các cảnh báo và các tùy chọn được điều chỉnh chặt chẽ như nhóm của bạn có thể theo dõi, có được một hệ thống xây dựng / kiểm tra / khẳng định tốt được xử lý như thế nào Grunt+Karma+Chaivà chỉ THEN bắt đầu đánh dấu tất cả các mô-đun mới của bạn "use strict". Hãy chuẩn bị để chữa rất nhiều lỗi và cảnh báo. Đảm bảo mọi người hiểu được lực hấp dẫn bằng cách định cấu hình bản dựng thành FAIL nếu JSHint/JSLinttạo ra bất kỳ vi phạm nào.

Dự án của tôi không phải là một dự án xanh khi tôi nhận nuôi "use strict". Kết quả là, IDE của tôi đầy dấu đỏ vì tôi không có "use strict"một nửa mô-đun của mình và JSHint phàn nàn về điều đó. Đó là một lời nhắc nhở cho tôi về việc tái cấu trúc tôi nên làm gì trong tương lai. Mục tiêu của tôi là được đánh dấu đỏ miễn phí do tất cả các "use strict"tuyên bố còn thiếu của tôi , nhưng đó là cách đây nhiều năm.


24
TẠI SAO các nhà phát triển trong chủ đề này nên ung dung về "sử dụng nghiêm ngặt" ?? Nó vượt qua các lỗi trong JavaScript hoạt động , vì lợi ích tốt! Chỉ cần rắc nó vào mã như đường trên Corn Flakes, eh? KHÔNG! XẤU! "Sử dụng nghiêm ngặt" nên được sử dụng một cách thận trọng, tốt nhất là chỉ trong mã bạn kiểm soát có các bài kiểm tra đơn vị vượt qua tất cả các trình duyệt chính và thực hiện tất cả các đường dẫn mã. Bạn có bài kiểm tra? Được rồi, "sử dụng nghiêm ngặt" là tốt cho bạn, đánh gục mình.
DWoldrich

57
Đúng. Rõ ràng "sử dụng nghiêm ngặt" có thể phá vỡ javascript dường như hợp lệ mà trước đây chưa bị hỏng. Nhưng mã không bị hỏng trước đó không bằng mã chính xác và thực hiện đúng những gì nó được yêu cầu. Thông thường việc tham chiếu các biến không được khai báo báo hiệu một lỗi đánh máy, v.v ... Sử dụng nghiêm ngặt cho phép bạn nắm bắt các loại lỗi này và hy vọng trước khi bạn gửi mã sản xuất.
Jostein Kjønigsen

5
... hoặc chỉ áp dụng "sử dụng nghiêm ngặt" như một phần của lần vượt qua mã cuối cùng của bạn, khắc phục tất cả các vấn đề rõ ràng, nhún vai, nói "đủ tốt", sau đó đưa nó ra để sản xuất :)
Wolfie Inu

13
Cá nhân, tôi không bao giờ / rất hiếm khi thêm "use strict"; vào mã hiện có. Điều đó đang được nói, hầu như tôi sẽ luôn sử dụng nó khi tôi viết mã mới từ đầu
Martin

3
Nếu bạn đã sử dụng JSLint, có lẽ bạn đã sửa hầu hết các địa điểm nơi "sử dụng nghiêm ngặt" sẽ phá vỡ mọi thứ.
Jonathan Cast

179

Sử dụng 'use strict';không đột nhiên làm cho mã của bạn tốt hơn.

Các chế độ hoạt Javascript nghiêm ngặt là một tính năng trong ECMAScript 5 . Bạn có thể kích hoạt chế độ nghiêm ngặt bằng cách khai báo điều này ở đầu tập lệnh / hàm của bạn.

'use strict';

Khi một công cụ JavaScript xem đây chỉ thị , nó sẽ bắt đầu để giải thích các mã trong một chế độ đặc biệt. Trong chế độ này, các lỗi được đưa ra khi các hoạt động mã hóa nhất định có thể là lỗi tiềm ẩn được phát hiện (đó là lý do đằng sau chế độ nghiêm ngặt).

Xem xét ví dụ này:

var a = 365;
var b = 030;

Trong nỗi ám ảnh của họ để sắp xếp các chữ số, nhà phát triển đã vô tình khởi tạo biến bvới một chữ bát phân. Chế độ không nghiêm ngặt sẽ diễn giải điều này dưới dạng chữ số có giá trị 24(trong cơ sở 10). Tuy nhiên, chế độ nghiêm ngặt sẽ ném một lỗi.

Đối với một danh sách không đầy đủ các đặc sản trong chế độ nghiêm ngặt, xem câu trả lời này .


Tôi nên sử dụng ở 'use strict';đâu?

  • Trong ứng dụng JavaScript mới của tôi : Hoàn toàn! Chế độ nghiêm ngặt có thể được sử dụng như một người thổi còi khi bạn đang làm điều gì đó ngu ngốc với mã của mình.

  • Trong mã JavaScript hiện tại của tôi : Có thể là không! Nếu mã JavaScript hiện tại của bạn có các câu lệnh bị cấm ở chế độ nghiêm ngặt, ứng dụng sẽ bị hỏng. Nếu bạn muốn chế độ nghiêm ngặt, bạn nên chuẩn bị để gỡ lỗi và sửa mã hiện có của mình. Đây là lý do tại sao việc sử dụng 'use strict';không đột nhiên làm cho mã của bạn tốt hơn .


Làm cách nào để sử dụng chế độ nghiêm ngặt?

  1. Chèn một 'use strict';tuyên bố trên đầu tập lệnh của bạn:

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....

    Lưu ý rằng mọi thứ trong tệp myscript.jssẽ được diễn giải ở chế độ nghiêm ngặt.

  2. Hoặc, chèn một 'use strict';tuyên bố trên đầu của cơ thể chức năng của bạn:

    function doSomething() {
        'use strict';
        ...
    }

    Mọi thứ trong phạm vi từ vựng của chức năng doSomethingsẽ được diễn giải trong chế độ nghiêm ngặt. Từ phạm vi từ vựng là quan trọng ở đây. Ví dụ: nếu mã nghiêm ngặt của bạn gọi hàm của thư viện không nghiêm ngặt , chỉ mã của bạn được thực thi ở chế độ nghiêm ngặt chứ không phải hàm được gọi. Xem câu trả lời này để được giải thích tốt hơn.


Điều gì bị cấm trong chế độ nghiêm ngặt?

Tôi tìm thấy một bài viết hay mô tả một số điều bị cấm trong chế độ nghiêm ngặt (lưu ý rằng đây không phải là một danh sách độc quyền):

Phạm vi

Trong lịch sử, JavaScript đã bị nhầm lẫn về cách các chức năng được phân chia. Đôi khi chúng dường như có phạm vi tĩnh, nhưng một số tính năng làm cho chúng hoạt động giống như chúng có phạm vi động. Điều này là khó hiểu, làm cho các chương trình khó đọc và hiểu. Hiểu lầm gây ra lỗi. Nó cũng là một vấn đề cho hiệu suất. Phạm vi tĩnh sẽ cho phép liên kết biến xảy ra tại thời điểm biên dịch, nhưng yêu cầu đối với phạm vi động có nghĩa là ràng buộc phải được hoãn lại trong thời gian chạy, đi kèm với một hình phạt hiệu suất đáng kể.

Chế độ nghiêm ngặt yêu cầu tất cả các ràng buộc biến được thực hiện tĩnh. Điều đó có nghĩa là các tính năng yêu cầu ràng buộc động trước đây phải được loại bỏ hoặc sửa đổi. Cụ thể, câu lệnh with bị loại bỏ và khả năng can thiệp vào chức năng của người gọi bị hạn chế nghiêm trọng.

Một trong những lợi ích của mã nghiêm ngặt là các công cụ như YUI Compressor có thể thực hiện công việc tốt hơn khi xử lý nó.

Biến toàn cầu

JavaScript đã ngụ ý các biến toàn cầu. Nếu bạn không khai báo rõ ràng một biến, một biến toàn cục sẽ được khai báo ngầm cho bạn. Điều này làm cho việc lập trình dễ dàng hơn cho người mới bắt đầu vì họ có thể bỏ qua một số công việc vệ sinh cơ bản. Nhưng nó làm cho việc quản lý các chương trình lớn trở nên khó khăn hơn nhiều và nó làm giảm đáng kể độ tin cậy. Vì vậy, trong chế độ nghiêm ngặt, các biến toàn cục ngụ ý không còn được tạo. Bạn nên khai báo rõ ràng tất cả các biến của bạn.

Rò rỉ toàn cầu

Có một số tình huống có thể gây ra this ràng buộc với đối tượng toàn cầu. Ví dụ: nếu bạn quên cung cấp newtiền tố khi gọi hàm xây dựng, thì hàm tạo thissẽ bị ràng buộc bất ngờ với đối tượng toàn cục, vì vậy thay vì khởi tạo một đối tượng mới, thay vào đó, nó sẽ âm thầm giả mạo các biến toàn cục. Trong những tình huống này, chế độ nghiêm ngặt thay vào đó sẽ liên kết thisvới undefined, điều này sẽ khiến cho hàm tạo thay một ngoại lệ, cho phép lỗi được phát hiện sớm hơn nhiều.

Thất bại ồn ào

JavaScript luôn có các thuộc tính chỉ đọc, nhưng bạn không thể tự tạo chúng cho đến khi Object.createProperty chức năng của ES5 thể hiện khả năng đó. Nếu bạn đã cố gán giá trị cho thuộc tính chỉ đọc, nó sẽ thất bại trong âm thầm. Việc chuyển nhượng sẽ không thay đổi giá trị của tài sản, nhưng chương trình của bạn sẽ tiến hành như thể nó đã có. Đây là một mối nguy toàn vẹn có thể khiến các chương trình đi vào trạng thái không nhất quán. Trong chế độ nghiêm ngặt, cố gắng thay đổi thuộc tính chỉ đọc sẽ đưa ra một ngoại lệ.

Octal

Biểu diễn số bát phân (hoặc cơ sở 8) cực kỳ hữu ích khi thực hiện lập trình cấp máy trên các máy có kích thước từ là bội số của 3. Bạn cần bát phân khi làm việc với máy tính lớn CDC 6600, có kích thước từ là 60 bit. Nếu bạn có thể đọc bát phân, bạn có thể xem một từ có 20 chữ số. Hai chữ số đại diện cho mã op và một chữ số xác định một trong 8 thanh ghi. Trong quá trình chuyển đổi chậm chạp từ mã máy sang ngôn ngữ cấp cao, việc cung cấp các hình thức bát phân trong các ngôn ngữ lập trình được cho là hữu ích.

Trong C, một đại diện cực kỳ đáng tiếc của bát phân đã được chọn: Dẫn đầu số không. Vì vậy, trong C, 0100có nghĩa là 64, không phải 100 và 08là lỗi, không phải 8. Không may hơn nữa, lỗi thời này đã được sao chép sang gần như tất cả các ngôn ngữ hiện đại, bao gồm cả JavaScript, nơi nó chỉ được sử dụng để tạo ra lỗi. Nó không có mục đích nào khác. Vì vậy, trong chế độ nghiêm ngặt, các hình thức bát phân không còn được phép.

Vân vân

Mảng giả đối số trở nên giống mảng hơn một chút trong ES5. Trong chế độ nghiêm ngặt, nó mất calleecaller thuộc tính của nó . Điều này làm cho nó có thể chuyển argumentsmã của bạn đến mã không tin cậy mà không từ bỏ nhiều bối cảnh bí mật. Ngoài ra, argumentstài sản của các chức năng được loại bỏ.

Trong chế độ nghiêm ngặt, các khóa trùng lặp trong một hàm bằng chữ sẽ tạo ra lỗi cú pháp. Một hàm không thể có hai tham số có cùng tên. Một hàm không thể có một biến có cùng tên với một trong các tham số của nó. Một hàm không thể deletebiến riêng của nó. Một nỗ lực cho deletemột tài sản không thể cấu hình bây giờ ném một ngoại lệ. Giá trị nguyên thủy không được bao bọc ngầm.


Các từ dành riêng cho các phiên bản JavaScript trong tương lai

ECMAScript 5 thêm một danh sách các từ dành riêng. Nếu bạn sử dụng chúng làm biến hoặc đối số, chế độ nghiêm ngặt sẽ gây ra lỗi. Các từ dành riêng là:

implements, interface, let, package, private, protected, public, static, Vàyield


Đọc thêm


2
đó là lời giải thích rất hay Tuy nhiên, tôi có một nghi ngờ rằng tôi có thể sử dụng chế độ "nghiêm ngặt" kết hợp với các thư viện tập lệnh java khác, như Angular js không?
UVM

3
@UVM: Chỉ thị chế độ nghiêm ngặt chỉ ảnh hưởng đến phạm vi từ vựng. tức là chỉ có tệp / hàm mà nó được khai báo. Nếu bạn có một tệp / hàm khác không có lệnh 'use strict', chúng sẽ được thực thi ở chế độ không nghiêm ngặt, ngay cả khi được gọi từ một hàm chạy ở chế độ nghiêm ngặt. Xem asnwer này để được giải thích.
sampathsris

Đây không phải là hoàn toàn chính xác. "Sử dụng nghiêm ngặt" sẽ thay đổi cách thực thi mã.
CyberEd

3
Ở cái nhìn thứ hai, bạn đã đúng. Tôi nghĩ bạn có nghĩa là nó chỉ ném ngoại lệ, nhưng không thay đổi cách làm việc của mã (như thay đổi this). Bây giờ tôi thấy bạn đã đề cập đến việc gọi các chức năng khác.
CyberEd

3
Có một số trường hợp bát phân là hữu ích. Cú pháp C cho nó thật kinh khủng, nhưng tôi muốn thấy các ngôn ngữ thêm một cú pháp bát phân mới mà sau đó có thể cho phép biểu mẫu hàng đầu không bị phản đối. Tất nhiên, để Javascript hỗ trợ hình thức zero-zero chỉ là ngớ ngẩn.
supercat

138

Tôi thực sự khuyên mọi nhà phát triển nên bắt đầu sử dụng chế độ nghiêm ngặt ngay bây giờ. Có đủ trình duyệt hỗ trợ nó rằng chế độ nghiêm ngặt sẽ giúp cứu chúng tôi khỏi các lỗi mà chúng tôi thậm chí không biết là trong mã của bạn.

Rõ ràng, ở giai đoạn ban đầu sẽ có những lỗi chúng ta chưa từng gặp phải trước đây. Để có được lợi ích đầy đủ, chúng tôi cần thực hiện kiểm tra thích hợp sau khi chuyển sang chế độ nghiêm ngặt để đảm bảo rằng chúng tôi đã nắm bắt được mọi thứ. Chắc chắn chúng tôi không chỉ ném use strictmã của mình và cho rằng không có lỗi. Vì vậy, vấn đề là đã đến lúc bắt đầu sử dụng tính năng ngôn ngữ cực kỳ hữu ích này để viết mã tốt hơn.

Ví dụ,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint là một trình gỡ lỗi được viết bởi Douglas Crockford. Chỉ cần dán vào tập lệnh của bạn và nó sẽ nhanh chóng quét tìm mọi vấn đề và lỗi đáng chú ý trong mã của bạn.


6
@JamieHutber: Vui lòng truy cập liên kết này caniuse.com/use-strictkangax.github.io/es5-compat-table . Nó sẽ đưa ra ý tưởng chính xác cho tất cả các trình duyệt.
Pank

95

Tôi muốn đưa ra một câu trả lời có phần sáng suốt hơn bổ sung cho các câu trả lời khác. Tôi đã hy vọng chỉnh sửa câu trả lời phổ biến nhất, nhưng không thành công. Tôi đã cố gắng làm cho nó toàn diện và đầy đủ nhất có thể.

Bạn có thể tham khảo tài liệu MDN để biết thêm thông tin.

"use strict" một chỉ thị được giới thiệu trong ECMAScript 5.

Chỉ thị tương tự như tuyên bố, nhưng khác nhau.

  • use strictkhông chứa các từ khóa: Lệnh này là một câu lệnh biểu thức đơn giản, bao gồm một chuỗi ký tự đặc biệt (trong dấu ngoặc đơn hoặc dấu ngoặc kép). Các công cụ JavaScript, không triển khai ECMAScript 5, chỉ xem một tuyên bố biểu thức mà không có tác dụng phụ. Dự kiến ​​các phiên bản tương lai của tiêu chuẩn ECMAScript sẽ giới thiệu usenhư một từ khóa thực sự; các trích dẫn do đó sẽ trở nên lỗi thời.
  • use strictchỉ có thể được sử dụng ở phần đầu của tập lệnh hoặc của hàm, tức là nó phải đi trước mọi câu lệnh (thực) khác. Nó không phải là hướng dẫn đầu tiên trong tập lệnh hàm: nó có thể được đi trước bởi các biểu thức câu lệnh khác bao gồm các chuỗi ký tự (và việc triển khai JavaScript có thể coi chúng là các chỉ thị cụ thể thực hiện). Các câu lệnh chuỗi ký tự, theo sau một câu lệnh thực đầu tiên (trong một tập lệnh hoặc hàm) là các câu lệnh biểu thức đơn giản. Thông dịch viên không được giải thích chúng là chỉ thị và chúng không có hiệu lực.

Lệnh use strictnày chỉ ra rằng đoạn mã sau (trong tập lệnh hoặc hàm) là mã nghiêm ngặt. Mã ở mức cao nhất của tập lệnh (mã không nằm trong hàm) được coi là mã nghiêm ngặt khi tập lệnh chứa lệnh use strict. Nội dung của hàm được coi là mã nghiêm ngặt khi chính hàm được xác định trong mã nghiêm ngặt hoặc khi hàm chứa lệnh use strict. Mã được truyền cho một eval()phương thức được coi là mã nghiêm ngặt khi eval()được gọi từ một mã nghiêm ngặt hoặc chứa use strictchính lệnh đó.

Chế độ nghiêm ngặt của ECMAScript 5 là một tập hợp con bị hạn chế của ngôn ngữ JavaScript, giúp loại bỏ các thiếu sót có liên quan của ngôn ngữ và có tính năng kiểm tra lỗi nghiêm ngặt hơn và bảo mật cao hơn. Sau đây liệt kê sự khác biệt giữa chế độ nghiêm ngặt và chế độ bình thường (trong đó ba chế độ đầu tiên đặc biệt quan trọng):

  • Bạn không thể sử dụng with-statement trong chế độ nghiêm ngặt.
  • Trong chế độ nghiêm ngặt, tất cả các biến phải được khai báo: nếu bạn gán giá trị cho mã định danh chưa được khai báo là biến, hàm, tham số hàm, tham số mệnh đề bắt hoặc thuộc tính của toàn cục Object, thì bạn sẽ nhận được a ReferenceError. Trong chế độ bình thường, định danh được khai báo ngầm định là biến toàn cục (như một thuộc tính của toàn cầu Object)
  • Trong chế độ nghiêm ngặt, từ khóa thiscó giá trị undefinedtrong các hàm được gọi là hàm (không phải là phương thức). (Ở chế độ bình thường thisluôn trỏ đến toàn cầu Object). Sự khác biệt này có thể được sử dụng để kiểm tra nếu việc triển khai hỗ trợ chế độ nghiêm ngặt:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Ngoài ra khi một hàm được gọi với call()hoặc applytrong chế độ nghiêm ngặt, thì đó thischính xác là giá trị của đối số đầu tiên của lệnh call()hoặc lệnh apply()gọi. (Trong chế độ bình thường nullundefinedđược thay thế bằng toàn cầu Objectvà các giá trị, không phải là đối tượng, được chuyển thành đối tượng.)

  • Trong chế độ nghiêm ngặt, bạn sẽ nhận được một TypeError, khi bạn cố gắng gán cho các thuộc tính chỉ đọc hoặc để xác định các thuộc tính mới cho một đối tượng không thể mở rộng. (Ở chế độ bình thường, cả hai đều thất bại mà không có thông báo lỗi.)

  • Trong chế độ nghiêm ngặt, khi chuyển mã tới eval(), bạn không thể khai báo hoặc xác định các biến hoặc hàm trong phạm vi của người gọi (vì bạn có thể làm điều đó trong chế độ bình thường). Thay vào đó, một phạm vi mới được tạo cho eval()và các biến và hàm nằm trong phạm vi đó. Phạm vi đó bị phá hủy sau khi eval()kết thúc thực hiện.
  • Trong chế độ nghiêm ngặt, đối tượng-đối tượng của hàm chứa một bản sao tĩnh của các giá trị, được truyền cho hàm đó. Trong chế độ bình thường, đối tượng-đối tượng có hành vi hơi "kỳ diệu": Các phần tử của mảng và các tham số hàm được đặt tên tham chiếu cả hai giá trị giống nhau.
  • Trong chế độ nghiêm ngặt, bạn sẽ nhận được một SyntaxErrorkhi deletetoán tử được theo sau bởi một định danh không đủ điều kiện (một tham số biến, hàm hoặc hàm). Trong chế độ bình thường, deletebiểu thức sẽ không làm gì và được ước tính false.
  • Trong chế độ nghiêm ngặt, bạn sẽ nhận được TypeErrorkhi bạn cố xóa một thuộc tính không thể định cấu hình. (Trong chế độ bình thường, nỗ lực đơn giản là thất bại và deletebiểu thức được ước tính false).
  • Trong chế độ nghiêm ngặt, nó được coi là một lỗi cú pháp khi bạn cố gắng xác định một số thuộc tính có cùng tên cho một đối tượng bằng chữ. (Ở chế độ bình thường không có lỗi.)
  • Trong chế độ nghiêm ngặt, nó được coi là lỗi cú pháp khi khai báo hàm có nhiều tham số có cùng tên. (Ở chế độ bình thường không có lỗi.)
  • Trong chế độ nghiêm ngặt, chữ bát phân không được phép (đây là những chữ bắt đầu bằng 0x. (Ở chế độ bình thường, một số cách triển khai cho phép chữ bát phân.)
  • Trong chế độ nghiêm ngặt các định danh evalargumentsđược coi như từ khóa. Bạn không thể thay đổi giá trị của chúng, không thể gán giá trị cho chúng và bạn không thể sử dụng chúng làm tên cho các biến, hàm, tham số hàm hoặc mã định danh của khối bắt.
  • Trong chế độ nghiêm ngặt có nhiều hạn chế hơn đối với khả năng kiểm tra ngăn xếp cuộc gọi. arguments.callerarguments.calleegây ra một TypeErrorchức năng trong chế độ nghiêm ngặt. Hơn nữa, một số thuộc tính của người gọi và đối số của các hàm trong chế độ nghiêm ngặt gây ra TypeErrorkhi bạn cố đọc chúng.

4
"Trong chế độ nghiêm ngặt, các chữ bát phân không được phép (đây là các chữ bắt đầu bằng 0x ...)" các chữ bát phân bắt đầu bằng chữ đầu 0.
Alex Gittemeier

83

Theo quan điểm của tôi:

Một trong những mục tiêu của chế độ nghiêm ngặt là cho phép gỡ lỗi nhanh hơn các vấn đề. Nó giúp các nhà phát triển bằng cách ném ngoại lệ khi một số điều sai xảy ra có thể gây ra hành vi im lặng & lạ cho trang web của bạn. Thời điểm chúng tôi sử dụng use strict, mã sẽ đưa ra các lỗi giúp nhà phát triển sửa lỗi trước.

Vài điều quan trọng mà tôi đã học được sau khi sử dụng use strict:

Ngăn chặn Tuyên bố biến toàn cầu:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

Bây giờ, mã này tạo ra nameoftreetrong phạm vi toàn cầu có thể được truy cập bằng cách sử dụng window.nameoftree. Khi chúng tôi thực hiện use strictmã sẽ ném lỗi.

Uncaught ReferenceError: nameoftree không được xác định

Sample

Loại bỏ withtuyên bố:

withcác câu lệnh không thể được thu nhỏ bằng các công cụ như uglify-js . Họ cũng không tán thành và xóa khỏi các phiên bản JavaScript trong tương lai.

Sample

Ngăn chặn trùng lặp:

Khi chúng ta có tài sản trùng lặp, nó sẽ ném một ngoại lệ

Uncaught SyntaxError: Sao chép thuộc tính dữ liệu trong đối tượng bằng chữ không được phép trong chế độ nghiêm ngặt

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

Có ít hơn nhưng tôi cần có thêm kiến ​​thức về điều đó.


Với tên tài sản trùng lặp ECMAScript 2015 được cho phép một lần nữa! Xem tài liệu MDN .
philmcole

62

Nếu bạn sử dụng một trình duyệt được phát hành vào năm ngoái hoặc lâu hơn thì rất có thể nó hỗ trợ chế độ Nghiêm JavaScript. Chỉ các trình duyệt cũ hơn trước khi ECMAScript 5 trở thành tiêu chuẩn hiện tại không hỗ trợ nó.

Các trích dẫn xung quanh lệnh đảm bảo rằng mã vẫn sẽ hoạt động trong các trình duyệt cũ hơn (mặc dù những điều tạo ra lỗi cú pháp ở chế độ nghiêm ngặt thường sẽ khiến tập lệnh gặp trục trặc trong một số trình duyệt cũ hơn).


12
Vậy thì nó làm gì?
Anish Gupta

7
... điều này mô tả một phần khả năng tương thích, nhưng không phải là những gì nó thực sự làm.
Courtimas

58

Khi thêm "use strict";, các trường hợp sau sẽ ném SyntaxError trước khi tập lệnh được thực thi:

  • Mở đường cho các phiên bản tương lai ECMAScript , sử dụng một trong những từ khóa mới được bảo lưu (trong sự dự liệu cho ECMAScript 6 ): implements, interface, let, package, private, protected, public, static, và yield.

  • Hàm khai báo trong khối

    if(a<b){ function f(){} }
  • Cú pháp bát phân

    var n = 023;
  • this chỉ vào đối tượng toàn cầu.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
  • Khai báo hai lần cùng tên cho một tên thuộc tính theo nghĩa đen

     {a: 1, b: 3, a: 7} 

    Đây không còn là trường hợp trong ECMAScript 6 ( lỗi 1041128 ).

  • Khai báo hai đối số hàm có cùng tên hàm

    f(a, b, b){}
  • Đặt giá trị cho biến không được khai báo

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
  • Sử dụng deletetên biếndelete myVariable;

  • Sử dụng evalhoặc argumentslàm tên đối số biến hoặc hàm

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 

Nguồn:


Với tên tài sản trùng lặp ECMAScript 2015 được cho phép một lần nữa! Xem tài liệu MDN .
philmcole

53

Chế độ nghiêm ngặt thực hiện một số thay đổi đối với ngữ nghĩa JavaScript thông thường:

  • loại bỏ một số lỗi im lặng JavaScript bằng cách thay đổi chúng để ném lỗi.

  • sửa các lỗi gây khó khăn cho các công cụ JavaScript để thực hiện tối ưu hóa.

  • nghiêm cấm một số cú pháp có thể được xác định trong các phiên bản tương lai của ECMAScript.

để biết thêm thông tin vistit Strict Mode- Javascript


52

"Sử dụng nghiêm ngặt"; là một bảo hiểm mà lập trình viên sẽ không sử dụng các thuộc tính lỏng lẻo hoặc xấu của JavaScript. Đó là một hướng dẫn, giống như một người cai trị sẽ giúp bạn thực hiện các đường thẳng. "Sử dụng nghiêm ngặt" sẽ giúp bạn thực hiện "Mã hóa thẳng".

Những người không thích sử dụng thước kẻ để thực hiện các dòng của họ thường kết thúc trong các trang đó yêu cầu người khác gỡ lỗi mã của họ.

Tin tôi đi. Chi phí không đáng kể so với mã được thiết kế kém. Doug Crockford, người đã là một nhà phát triển JavaScript cao cấp trong nhiều năm, có một bài viết rất thú vị ở đây . Cá nhân, tôi muốn quay lại trang web của anh ấy mọi lúc để đảm bảo rằng tôi không quên thực hành tốt.

Thực hành JavaScript hiện đại phải luôn luôn gợi lên "Sử dụng nghiêm ngặt"; pragma. Lý do duy nhất mà Tập đoàn ECMA đưa ra tùy chọn chế độ "Nghiêm" là cho phép các lập trình viên ít kinh nghiệm truy cập vào JavaScript và sau đó dành thời gian để thích nghi với các thực tiễn mã hóa mới và an toàn hơn.


66
Lý do chế độ nghiêm ngặt là tùy chọn không liên quan gì đến những gì bạn đã nêu. Lý do thực sự là không phá vỡ mã hiện có có thể không phù hợp .
Dexygen

17
Thật vậy, các lập trình viên ít kinh nghiệm nên là những người đầu tiên cho phép "sử dụng nghiêm ngặt";
Antti Haapala

46

Bao gồm use stricttrong phần đầu của tất cả các tệp JavaScript nhạy cảm của bạn từ thời điểm này là một cách nhỏ để trở thành một lập trình viên JavaScript tốt hơn và tránh các biến ngẫu nhiên trở thành toàn cầu và mọi thứ thay đổi âm thầm.


42

Trích dẫn từ w3schools :

Chỉ thị "sử dụng nghiêm ngặt"

Lệnh "sử dụng nghiêm ngặt" là mới trong JavaScript 1.8.5 (phiên bản ECMAScript 5).

Đây không phải là một tuyên bố, mà là một biểu thức nghĩa đen, bị bỏ qua bởi các phiên bản JavaScript trước đó.

Mục đích của "sử dụng nghiêm ngặt" là để chỉ ra rằng mã phải được thực thi trong "chế độ nghiêm ngặt".

Với chế độ nghiêm ngặt, ví dụ, bạn không thể sử dụng các biến không được khai báo.

Tại sao Chế độ nghiêm ngặt?

Chế độ nghiêm ngặt giúp viết JavaScript "an toàn" dễ dàng hơn.

Thay đổi chế độ nghiêm ngặt trước đây đã chấp nhận "cú pháp xấu" thành lỗi thực.

Ví dụ, trong JavaScript thông thường, việc nhập sai tên biến sẽ tạo ra một biến toàn cục mới. Trong chế độ nghiêm ngặt, điều này sẽ gây ra lỗi, khiến nó không thể vô tình tạo ra một biến toàn cục.

Trong JavaScript thông thường, nhà phát triển sẽ không nhận được bất kỳ phản hồi lỗi nào khi gán giá trị cho các thuộc tính không thể ghi.

Trong chế độ nghiêm ngặt, bất kỳ sự gán nào cho một thuộc tính không thể ghi, thuộc tính chỉ getter, thuộc tính không tồn tại, biến không tồn tại hoặc đối tượng không tồn tại sẽ gây ra lỗi.

Vui lòng tham khảo http://www.w3schools.com/js/js_strict.asp để biết thêm


37

"use strict"làm cho mã JavaScript chạy ở chế độ nghiêm ngặt , về cơ bản có nghĩa là mọi thứ cần được xác định trước khi sử dụng. Lý do chính cho việc sử dụng chế độ nghiêm ngặt là để tránh việc sử dụng toàn cầu các phương thức không xác định.

Ngoài ra trong chế độ nghiêm ngặt, mọi thứ chạy nhanh hơn, một số cảnh báo hoặc cảnh báo im lặng ném các lỗi nghiêm trọng, tốt hơn là luôn luôn sử dụng nó để tạo mã gọn gàng hơn.

"use strict"được sử dụng rộng rãi trong ECMA5, trong ECMA6 theo mặc định , nó là một phần của JavaScript , vì vậy không cần thêm vào nếu bạn đang sử dụng ES6.

Nhìn vào các tuyên bố và ví dụ từ MDN:

Chỉ thị "sử dụng nghiêm ngặt"
Lệnh "sử dụng nghiêm ngặt" là mới trong JavaScript 1.8.5 (phiên bản ECMAScript 5). Đây không phải là một tuyên bố, mà là một biểu thức nghĩa đen, bị bỏ qua bởi các phiên bản JavaScript trước đó. Mục đích của "sử dụng nghiêm ngặt" là để chỉ ra rằng mã phải được thực thi trong "chế độ nghiêm ngặt". Với chế độ nghiêm ngặt, ví dụ, bạn không thể sử dụng các biến không được khai báo.

Ví dụ về sử dụng "userict":
Chế độ nghiêm ngặt cho các chức năng: Tương tự như vậy, để gọi chế độ nghiêm ngặt cho một chức năng, hãy đặt câu lệnh chính xác "sử dụng nghiêm ngặt"; (hoặc 'sử dụng nghiêm ngặt';) trong cơ thể của hàm trước bất kỳ câu lệnh nào khác.

1) chế độ nghiêm ngặt trong các chức năng

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) chế độ nghiêm ngặt toàn tập lệnh

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) Chuyển nhượng cho một toàn cầu không thể ghi

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

Bạn có thể đọc thêm về MDN .


31

Có một cuộc nói chuyện tốt của một số người trong ủy ban ECMAScript: Thay đổi về JavaScript, Phần 1: ECMAScript 5 " về cách sử dụng "use strict"chuyển đổi gia tăng cho phép người triển khai JavaScript dọn sạch rất nhiều tính năng nguy hiểm của JavaScript mà không đột nhiên phá vỡ mọi trang web trên thế giới.

Tất nhiên, nó cũng nói về việc rất nhiều trong số những điều không phù hợp đó là (và) và cách ECMAScript 5 sửa chúng.


27

Ví dụ nhỏ để so sánh:

Chế độ không nghiêm ngặt:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

Chế độ nghiêm ngặt:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

Chế độ không nghiêm ngặt:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true


2
Lưu ý rằng mã ở trên sẽ thêm biến i vào phạm vi toàn cầu (nói chung đây không phải là cách thực hành tốt nhất và chế độ nghiêm ngặt giúp tránh điều đó).
michael

1
Ai đó có thể giải thích ví dụ thứ hai? Tôi không hiểu Không nên this === 'a'trong cả hai ví dụ?
MaximeW

19

Lưu ý rằng use strictđã được giới thiệu trong EcmaScript 5 và được giữ từ đó.

Dưới đây là các điều kiện để kích hoạt chế độ nghiêm ngặt trong ES6ES7 :

  • Mã toàn cầu là mã chế độ nghiêm ngặt nếu nó bắt đầu bằng Lời mở đầu chỉ thị có chứa Chỉ thị nghiêm ngặt sử dụng (xem 14.1.1).
  • Mã mô-đun luôn là mã chế độ nghiêm ngặt.
  • Tất cả các phần của ClassDeclaration hoặc ClassExpression đều là mã chế độ nghiêm ngặt.
  • Mã Eval là mã chế độ nghiêm ngặt nếu nó bắt đầu bằng Chỉ thị Chỉ thị có chứa Chỉ thị nghiêm ngặt sử dụng hoặc nếu lệnh gọi tới eval là một eval trực tiếp (xem 12.3.4.1) được chứa trong mã chế độ nghiêm ngặt.
  • Mã chức năng là mã chế độ nghiêm ngặt nếu liên kết FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefDef hoặc ArrowFunction được chứa trong mã chế độ nghiêm ngặt hoặc nếu mã tạo ra giá trị của khe cắm bên trong của hàm [[ECMAScriptCode]] có chứa Chỉ thị Nghiêm sử dụng.
  • Mã chức năng được cung cấp làm đối số cho các hàm tạo Hàm và Trình tạo tích hợp là mã chế độ nghiêm ngặt nếu đối số cuối cùng là Chuỗi mà khi được xử lý là FunctionBody bắt đầu bằng Chỉ thị Chỉ thị có Chỉ thị Nghiêm Sử dụng.

14

Những lý do chính tại sao các nhà phát triển nên sử dụng "use strict"là:

  1. Ngăn chặn khai báo ngẫu nhiên các biến toàn cục . Sử dụng "use strict()"sẽ đảm bảo rằng các biến được khai báo vartrước khi sử dụng. Ví dụ:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
  2. NB: Lệnh "use strict"chỉ được nhận ra khi bắt đầu tập lệnh hoặc hàm.
  3. Chuỗi "arguments"không thể được sử dụng như một biến:

    "use strict";
    var arguments = 3.14;    // This will cause an error
  4. Sẽ hạn chế sử dụng từ khóa làm biến. Cố gắng sử dụng chúng sẽ ném lỗi.

Nói tóm lại sẽ làm cho mã của bạn ít bị lỗi hơn và đến lượt nó sẽ khiến bạn viết mã tốt.

Để đọc thêm về nó bạn có thể tham khảo ở đây .


12

"Sử dụng nghiêm ngặt"; là nỗ lực của ECMA để làm cho JavaScript mạnh mẽ hơn một chút. Nó mang đến cho JS một nỗ lực để làm cho nó ít nhất một chút "nghiêm ngặt" (các ngôn ngữ khác thực hiện các quy tắc nghiêm ngặt từ những năm 90). Nó thực sự "buộc" các nhà phát triển JavaScript tuân theo một số loại thực tiễn tốt nhất về mã hóa. Tuy nhiên, JavaScript rất mong manh. Không có thứ gì như biến được gõ, phương thức gõ, v.v. gỡ lỗi.


12

Chế độ nghiêm ngặt của JavaScript JavaScript được giới thiệu trong ECMAScript 5.

(function() {
  "use strict";
  your code...
})();

Viết "use strict";ở đầu tệp JS của bạn bật kiểm tra cú pháp nghiêm ngặt. Nó thực hiện các nhiệm vụ sau đây cho chúng tôi:

  1. hiển thị lỗi nếu bạn cố gán cho biến không được khai báo

  2. ngăn bạn ghi đè các thư viện hệ thống JS chính

  3. cấm một số tính năng ngôn ngữ không an toàn hoặc dễ bị lỗi

use strictcũng hoạt động bên trong các chức năng cá nhân. Nó luôn luôn là một thực hành tốt hơn để bao gồm use stricttrong mã của bạn.

Vấn đề tương thích trình duyệt: Chỉ thị "sử dụng" có nghĩa là tương thích ngược. Các trình duyệt không hỗ trợ chúng sẽ chỉ thấy một chuỗi ký tự không được tham chiếu thêm. Vì vậy, họ sẽ vượt qua nó và đi tiếp.


12

use strictlà một cách để làm cho mã của bạn an toàn hơn, bởi vì bạn không thể sử dụng các tính năng nguy hiểm có thể hoạt động không như bạn mong đợi. Và, như đã được viết trước đó, nó làm cho mã nghiêm ngặt hơn.


11

Use Strict được sử dụng để hiển thị các lỗi phổ biến và lặp đi lặp lại để nó được xử lý khác nhau và thay đổi cách chạy tập lệnh java, những thay đổi đó là:

  • Ngăn chặn tình cờ toàn cầu

  • Không trùng lặp

  • Loại bỏ với

  • Loại bỏ sự ép buộc này

  • An toàn hơn ()

  • Lỗi cho bất biến

bạn cũng có thể đọc bài viết này để biết chi tiết


11

Thông thường, JavaScript không tuân theo các quy tắc nghiêm ngặt, do đó làm tăng cơ hội lỗi. Sau khi sử dụng "use strict", mã JavaScript phải tuân theo bộ quy tắc nghiêm ngặt như trong các ngôn ngữ lập trình khác như sử dụng bộ kết thúc, khai báo trước khi khởi tạo, v.v.

Nếu "use strict"được sử dụng, mã phải được viết bằng cách tuân theo một bộ quy tắc nghiêm ngặt, do đó làm giảm khả năng xảy ra lỗi và sự mơ hồ.


7

"Sử dụng nghiêm ngặt"; Xác định rằng mã JavaScript phải được thực thi trong "chế độ nghiêm ngặt".

  • Lệnh "sử dụng nghiêm ngặt" là mới trong ECMAScript phiên bản 5.
  • Đây không phải là một tuyên bố, mà là một biểu thức nghĩa đen, bị bỏ qua bởi các phiên bản JavaScript trước đó.
  • Mục đích của "sử dụng nghiêm ngặt" là để chỉ ra rằng mã phải được thực thi trong "chế độ nghiêm ngặt".
  • Với chế độ nghiêm ngặt, ví dụ, bạn không thể sử dụng các biến không được khai báo.

Tất cả các trình duyệt hiện đại đều hỗ trợ "sử dụng nghiêm ngặt" ngoại trừ Internet Explorer 9 trở xuống .

Bất lợi

Nếu nhà phát triển sử dụng thư viện ở chế độ nghiêm ngặt, nhưng nhà phát triển đã quen làm việc ở chế độ bình thường, họ có thể gọi một số hành động trên thư viện sẽ không hoạt động như mong đợi.

Tồi tệ hơn, vì nhà phát triển ở chế độ bình thường, họ không có lợi thế của các lỗi bổ sung bị ném, do đó, lỗi có thể thất bại trong âm thầm.

Ngoài ra, như được liệt kê ở trên, chế độ nghiêm ngặt ngăn bạn làm những việc nhất định.

Mọi người thường nghĩ rằng bạn không nên sử dụng những thứ đó ngay từ đầu, nhưng một số nhà phát triển không thích sự ràng buộc và muốn sử dụng tất cả các tính năng của ngôn ngữ.


4

Chế độ nghiêm ngặt có thể ngăn chặn rò rỉ bộ nhớ.

Vui lòng kiểm tra chức năng bên dưới được viết ở chế độ không nghiêm ngặt:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

Trong hàm này, chúng ta đang sử dụng một biến được gọi namebên trong hàm. Trong nội bộ, trình biên dịch trước tiên sẽ kiểm tra xem có bất kỳ biến nào được khai báo với tên cụ thể đó trong phạm vi chức năng cụ thể đó không. Vì trình biên dịch hiểu rằng không có biến như vậy, nên nó sẽ kiểm tra trong phạm vi bên ngoài. Trong trường hợp của chúng tôi, nó là phạm vi toàn cầu. Một lần nữa, trình biên dịch hiểu rằng cũng không có biến nào được khai báo trong không gian toàn cầu với tên đó, vì vậy nó tạo ra một biến như vậy cho chúng ta trong không gian toàn cầu. Về mặt khái niệm, biến này sẽ được tạo trong phạm vi toàn cầu và sẽ có sẵn trong toàn bộ ứng dụng.

Một kịch bản khác là, giả sử, biến được khai báo trong hàm con. Trong trường hợp đó, trình biên dịch kiểm tra tính hợp lệ của biến đó trong phạm vi bên ngoài, tức là hàm cha. Chỉ sau đó nó sẽ kiểm tra trong không gian toàn cầu và tạo ra một biến cho chúng tôi ở đó. Điều đó có nghĩa là kiểm tra bổ sung cần phải được thực hiện. Điều này sẽ ảnh hưởng đến hiệu suất của ứng dụng.


Bây giờ hãy viết chức năng tương tự trong chế độ nghiêm ngặt.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

Chúng tôi sẽ nhận được các lỗi sau.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

Ở đây, trình biên dịch ném lỗi tham chiếu. Trong chế độ nghiêm ngặt, trình biên dịch không cho phép chúng ta sử dụng biến mà không khai báo nó. Vì vậy, rò rỉ bộ nhớ có thể được ngăn chặn. Ngoài ra, chúng ta có thể viết mã tối ưu hơn.

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.