a

Câu hỏi "Sử dụng nghiêm ngặt" làm gì trong JavaScript và lý do đằng sau nó là gì?


Gần đây, tôi đã chạy một số mã JavaScript của mình thông qua Crockford's JSLintvà nó đã đưa ra lỗi sau:

Sự cố ở 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 tuyên bố, lỗi sẽ xuất hiện. Thật không may, Google đã không tiết lộ phần lớn 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 giải thích bởi trình duyệt, nhưng tôi không có ý tưởng những gì có hiệu lực sẽ được.

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

Có bất kỳ trình duyệt hiện tại nào trả lời "use strict"; chuỗi hoặc là nó để sử dụng trong tương lai?


6712
2017-08-26 16:10


gốc




Các câu trả lời:


Bài viết này về Chế độ Ngắt Javascript có thể khiến bạn quan tâm: John Resig - ECMAScript 5 Chế độ nghiêm ngặt, 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 chương trình hoặc chức năng trong ngữ cảnh hoạt động "nghiêm ngặt". Ngữ cảnh nghiêm ngặt này ngăn cản một số hành động nhất định khỏi bị lấy và ném thêm nhiều ngoại lệ.

Và:

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

  • Nó bắt một số lỗi mã hóa phổ biến, ném các ngoại lệ.
  • Nó ngăn chặn, hoặc ném lỗi, khi hành động tương đối "không an toàn" được thực hiện (chẳng hạn như được 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 hàm 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ới ;-)

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

Hiện tại, đó là được hỗ trợ bởi tất cả các trình duyệt chính  (thanh IE 9 trở xuống).


4399
2017-08-26 16:15



Thay đổi mặc định sau nhiều năm? Quá muộn cho điều đó: nó sẽ phá vỡ rất nhiều trang web / script / ứ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
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 nào, vì vậy tôi đoán 'sử dụng nghiêm ngặt' không được hỗ trợ trong bất kỳ trình duyệt nào. Đã không kiểm tra trong IE9 mặc dù;) - Husky
Cập nhật nhanh: Firefox 4 có 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. Safari và Chrome có hỗ trợ "một phần", nhưng tôi thực sự không biết điều đó có nghĩa là gì. - Sasha Chedygov
Chrome 11 dường như vượt qua tất cả các thử nghiệm này cũng như IE10 ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html# - gman
@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ũ. Việc thêm một chuỗi ký tự "ngẫu nhiên" không phá vỡ bất kỳ thứ gì. - nnnnnn


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

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

"use strict";

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


1103
2017-08-26 16:14



Thất bại nhanh và thất bại to. - Niels Bom
Nếu bạn đang viết nội tuyến Javascript trong các tệp HTML, hãy bắt đầu từng khối mới bằng <script>"use strict";. Cờ chỉ áp dụng cho khối mà nó được bao gồm. - nobar
Thật buồn cười, điều này dẫn đến các chuỗi phải có dấu nháy đơn. Vì vậy, viết 'use strict'; thay thế - nilsi
sau đó điều gì sẽ xảy ra với khái niệm cẩu của javascript? - Sunil Sharma
@SunilSharma Nếu bạn cố gắng hoist, nhưng nó thất bại vì biến không được xác định, tại thời điểm nó sẽ thêm nó vào đối tượng toàn cầu. Với "use strict";thay vào đó, nó sẽ thất bại. Đ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ục có nghĩa là nó có thể không hoạt động vào lần sau khi bạn chạy hàm / làm cái gì khác để đặt lại khối, vì nó sẽ ở khối cao nhất (toàn cục). - wizzwizz4


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

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ục. (Mất tích var khai báo và lỗi chính tả trong các tên biến)

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

  3. Nỗ lực xóa 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 theo nghĩa đen là duy nhất (var x = {x1: "1", x1: "2"})

  5. Tên tham số chức năng 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ố dev giả định sai rằng một số không trước không làm gì để thay đổi số.)

  7. Cấm with từ khóa

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

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

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

  11. Chế độ nghiêm ngặt không thuộc tính bí danh 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] là ràng buộc để a và vân vân. )

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

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


519
2017-11-24 21:22



Nit: biến toàn cầu được cho phép, chỉ cần phải rõ ràng (ví dụ: window.foo = bar). - gcampbell
Yêu cầu tất cả các tên thuộc tính trong một đối tượng là chữ cái duy nhất (var x = {x1: "1", x1: "2"}) là hợp lệ - Arun Killu
Ví dụ của bạn trong 11 là 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; } cảnh báo (tổng (1, 2)) sẽ trả về 3 với chế độ nghiêm ngặt và 2 không có chế độ nghiêm ngặt, do răng cưa. - David Gausmann
bạn vừa lưu tôi vài giờ gỡ lỗi với # 6 - jazzcat


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

ECMAScript 5 'Chế độ nghiêm ngặt' hỗ trợ trong trình duyệt. Điều đó có nghĩa là gì?
NovoGeek.com - nhật ký web 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.
*/

369
2017-07-15 23:25



Tôi không đồng ý. Tôi nghĩ điều này cho thấy lý do tại sao nó rất hữu ích. Về bản chất nó có nghĩa là điều này trả về hàm của nó chứ không phải hàm window - Jamie Hutber
khi nào bạn muốn cửa sổ this mà bạn không thể nhắm mục tiêu window? - Jamie Hutber
Nó đề cập đến chính nó. this thuộc về chức năng riêng của nó và không phải là cửa sổ toàn cầu - Jamie Hutber
Trong cái thứ hai this một thực tế là undefined. - Broxzier
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 của một undefined, 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 các lỗi tinh vi dễ dàng hơn nhiều. - Stephen Chung


Một lời cảnh cáo, tất cả các bạn lập trình khó tính phí: áp dụng "use strict" với mã hiện có có thể nguy hiểm! Điều này không phải là một số nhãn dán cảm giác vui vẻ, hạnh phúc 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 ném các ngoại lệ vào những nơi ngẫu nhiên mà nó chưa bao giờ ném trước đó chỉ vì tại chỗ đó bạn đang làm điều gì đó mà JavaScript mặc định / lỏng lẻo vui vẻ cho phép nhưng các tác giả JavaScript nghiêm ngặt! Bạn có thể có các vi phạm nghiêm ngặt ẩn trong ít khi được sử dụng các cuộc gọi trong mã của bạn mà sẽ chỉ ném một ngoại lệ khi họ cuối cùng có được chạy - nói, 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 đang đi để có những lao, nó là một ý tưởng tốt để áp dụng "use strict" cùng với các bài kiểm tra đơn vị toàn diện và nhiệm vụ xây dựng JSHint được cấu hình chặt chẽ sẽ cho bạn một chút tự tin rằng không có góc tối nào trong mô-đun của bạn sẽ thổi lên khủng khiếp chỉ vì bạn đã bật Chế độ nghiêm ngặt. Hoặc, đây là một tùy chọn khác: chỉ cần không thêm "use strict" với bất kỳ mã kế thừa nào của bạn, nó có thể an toàn hơn theo cách đó, một cách trung thực. DEFINITELY KHÔNG thêm vào "use strict" với bất kỳ mô-đun nào bạn không sở hữu hoặc duy trì, chẳng hạn như mô-đun bên thứ ba.

Tôi nghĩ mặc dù nó là một con vật bị giết chết, "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 từ đầu. Định cấu hình JSHint/JSLint với tất cả các cảnh báo và tùy chọn quay lên chặt chẽ như đội của bạn có thể dạ dày, có được một xây dựng tốt / thử nghiệm / hệ thống khẳng định du jour gian lận như Grunt+Karma+Chaivà chỉ THEN bắt đầu đánh dấu tất cả các mô đun mới của bạn là "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 greenfield khi tôi đã thông qua "use strict". Kết quả là, IDE của tôi có đầy đủ các dấu đỏ bởi vì tôi không có "use strict" trên một nửa mô-đun của tôi 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 mà tôi nên làm trong tương lai. Mục tiêu của tôi là được đánh dấu màu đỏ miễn phí do tất cả những gì tôi mất tích "use strict" báo cáo, nhưng đó là năm nay.


182
2018-03-03 07:37



TẠI SAO là devs trong thread này để cavalier về "sử dụng nghiêm ngặt" ?? Nó ném ngoại lệ trong JavaScript hoạt động, vì sự tốt lành! Chỉ cần rắc lên 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 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ó xét nghiệm? Được rồi, "sử dụng nghiêm ngặt" là tốt cho bạn, gõ mình ra. - DWoldrich
Vâng. Rõ ràng "sử dụng nghiêm ngặt" có thể phá vỡ javascript dường như hợp lệ mà không bị hỏng trước đây. Nhưng mã không bị hỏng trước đó không bằng mã đúng và làm những gì nó được cho là. Thông thường tham chiếu các biến không khai báo báo hiệu lỗi chính tả, 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
... hoặc chỉ áp dụng "sử dụng nghiêm ngặt" như một phần của lần cuối qua mã 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 đó mang nó ra để sản xuất :) - Wolfie Inu
Cá nhân, tôi không bao giờ / rất hiếm khi thêm vào  "use strict"; với mã hiện có. Điều đó đang được nói, tôi sẽ hầu như luôn luôn sử dụng nó khi tôi đang viết mã mới từ đầu - Martin
Nếu bạn đã sử dụng JSLint, có thể bạn đã sửa hầu hết các nơi mà "sử dụng nghiêm ngặt" sẽ phá vỡ mọi thứ. - Jonathan Cast


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ế độ nghiêm ngặt JavaScript là một tính năng trong ECMAScript 5. Bạn có thể bật chế độ nghiêm ngặt bằng cách khai báo điều này ở đầu tập lệnh / chức năng của bạn.

'use strict';

Khi một công cụ JavaScript thấy điều này chỉ thị, nó sẽ bắt đầu diễn giải mã trong một chế độ đặc biệt. Trong chế độ này, lỗi được ném lên khi thực hành mã hóa nhất định mà có thể kết thúc là lỗi tiềm năng đượ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ọ để xếp hàng các chữ số, nhà phát triển đã vô tình khởi tạo biến b với một số 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ẽ gây ra lỗi.

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


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

  • trong tôi Mới Ứng dụng JavaScript: Chắc chắn rồi! 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 bạn.

  • trong tôi hiện tại Mã JavaScript: Chắc là không! Nếu mã JavaScript hiện tại của bạn có các câu lệnh bị nghiêm cấm trong chế độ nghiêm ngặt, ứng dụng sẽ đơn giản phá vỡ. 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 tại của mình. Đây là lý do tại sao 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.js sẽ được diễn giải ở chế độ nghiêm ngặt.

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

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

    Mọi thứ trong phạm vi từ vựng chức năng doSomething sẽ được diễn giải ở chế độ nghiêm ngặt. Từ phạm vi từ vựng là quan trọng ở đây. Xem câu trả lời này cho một lời giải thích tốt hơn.


Những đ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 ở chế độ nghiêm ngặt (lưu ý rằng đây không phải là danh sách độc quyền):

Phạm vi

Trong lịch sử, JavaScript đã bị nhầm lẫn về cách các hàm   được scoped. Đôi khi chúng có vẻ như bị nhiễu, nhưng một số   các tính năng làm cho chúng hoạt động giống như chúng được sắp xếp động. Đây là   gây nhầm lẫn, khiến cho các chương trình trở nên khó đọc và dễ 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 ràng buộc biến xảy ra khi biên dịch   thời gian, nhưng yêu cầu đối với phạm vi động có nghĩa là ràng buộc phải là   trì hoãn thời gian chạy, đi kèm với hiệu suất đáng kể   hình phạt.

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 mà trước đó yêu cầu ràng buộc động   phải được loại bỏ hoặc sửa đổi. Cụ thể, câu lệnh với   bị loại bỏ và khả năng của hàm eval để giả mạo   môi trường của người gọi của nó 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ư Máy nén YUI   có thể làm tốt hơn khi xử lý nó.

Các biến toàn cầu bị ngụ ý

JavaScript đã ngụ ý các biến toàn cầu. Nếu   bạn không khai báo một biến rõ ràng, biến toàn cầu là   được khai báo hoàn toàn cho bạn. Điều này giúp lập trình dễ dàng hơn cho   người mới bắt đầu bởi vì họ có thể bỏ bê một số dịch vụ vệ sinh cơ bản của họ   công việc. Nhưng nó làm cho việc quản lý các chương trình lớn hơn   khó khăn và nó làm giảm đáng kể độ tin cậy. Vì vậy, trong nghiêm ngặt   chế độ, các biến toàn cầu 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   bị ràng buộc với đối tượng toàn cục. Ví dụ: nếu bạn quên   cung cấp new tiền tố khi gọi hàm dựng hàm,   người xây dựng this sẽ 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 với các biến toàn cục. Trong những tình huống này, chế độ nghiêm ngặt sẽ   thay vào đó ràng buộc this đến undefined, điều này sẽ gây ra hàm tạo   ném một ngoại lệ thay vào đó, cho phép phát hiện lỗi nhiều   sớm hơn.

Lỗi ồn ào

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

Octal

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

Trong C, một biểu hiện cực kỳ không may của bát phân là   được chọn: Hàng đầu bằng không. Vì vậy, trong C, 0100 có nghĩa là 64, không phải 100 và 08 là một   lỗi, không phải 8. Thật không may, sự lỗi thời này đã được   được sao chép vào gần như tất cả các ngôn ngữ hiện đại, bao gồm JavaScript, trong đó   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, dạng bát phân không còn được phép.

Vân vân

Đối số mảng giả sẽ trở thành một chút nữa   giống như trong ES5. Ở chế độ nghiêm ngặt, nó mất callee và caller   tính chất. Điều này giúp bạn có thể vượt qua arguments không tin cậy   mã mà không từ bỏ nhiều bối cảnh bí mật. Ngoài ra,    arguments tài sản của các hàm được loại bỏ.

Trong chế độ nghiêm ngặt, các khóa trùng lặp trong một hàm theo nghĩa đen 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ó biến có cùng tên với một biến   thông số. Một hàm không thể delete các biến của riêng nó. Một nỗ lực để    delete một thuộc tính không thể cấu hình bây giờ ném một ngoại lệ. Nguyên thủy   các giá trị không được bọc hoàn toàn.


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

ECMAScript 5 thêm 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ẽ phát ra lỗi. Các từ dành riêng là:

implements, interface, let, package, private, protected, public, staticyield


Đọc thêm


131
2018-01-29 11:35



nó 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? - UVM
@UVM: Chỉ thị chế độ nghiêm ngặt chỉ ảnh hưởng đến phạm vi từ vựng. tức là chỉ tệp / chức năng được khai báo. Nếu bạn có một tệp / hàm khác không có 'use strict' chỉ thị, chúng sẽ được thực hiện ở 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 cái này cho một lời giải thích. - Krumia
cảm ơn vì lời giải thích của bạn. Tôi hiểu rằng chế độ "nghiêm ngặt" chỉ ảnh hưởng đến "mã", không ảnh hưởng đến "thực thi" - UVM
Nhìn thứ hai, bạn nói đú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 mã hoạt động (như thay đổi this). Bây giờ tôi thấy bạn đang đề cập đến việc gọi các chức năng khác. - CyberEd
Có một số trường hợp bát phân rất hữu ích. Cú pháp C cho nó là khủng khiếp, nhưng tôi đã có thể thích 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 hình thức hàng đầu bằng 0 không được chấp nhận. Tất nhiên, đối với Javascript đã hỗ trợ hình thức hàng đầu bằng không chỉ là ngớ ngẩn. - supercat


Tôi khuyên tất cả các 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 tiết kiệm hợp pháp 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ó lỗi chúng tôi chưa bao giờ gặp phải trước đây. Để có được lợi ích đầy đủ, chúng tôi cần phải làm thử nghiệm thích hợp sau khi chuyển sang chế độ nghiêm ngặt để đảm bảo chúng tôi đã thu hút mọi thứ. Chắc chắn chúng ta không chỉ ném use strict trong mã của chúng tôi và giả sử không có lỗi. Vì vậy, sự khuấy động 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 bất kỳ vấn đề và lỗi nào đáng chú ý trong mã của bạn.


122
2017-07-05 19:38



@JamieHutber: Vui lòng truy cập liên kết này caniuse.com/use-strict  VÀ kangax.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


Tôi muốn cung cấp một câu trả lời hơi thành lập 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 thất bại. Tôi đã cố gắng làm cho nó hoàn chỉnh 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.

Các chỉ thị tương tự như các câu lệnh, nhưng khác nhau.

  • use strict không chứa các từ khóa: Chỉ thị là một câu lệnh biểu thức đơn giản, trong đó bao gồm một chuỗi ký tự đặc biệt (trong dấu nháy đơn hoặc kép). Các công cụ JavaScript, không thực hiện ECMAScript 5, chỉ nhìn thấy một câu lệnh biểu hiện mà không có cá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 use như một từ khóa thực sự; các dấu ngoặc kép do đó sẽ trở nên lỗi thời.
  • use strict chỉ có thể được sử dụng ở đầu tập lệnh hoặc hàm, tức là nó phải đứng trước mỗi câu lệnh (thực) khác. Nó không phải là lệnh đầu tiên trong một kịch bản hàm: nó có thể được đặt 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à các triển khai JavaScript có thể coi chúng như là các chỉ thị cụ thể thực hiện). Các câu lệnh literal chuỗi, theo một câu lệnh thực đầu tiên (trong một kịch bản 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 hiểu chúng là chỉ thị và chúng không có hiệu lực.

Các use strictchỉ thị chỉ ra rằng mã sau (trong một kịch bản hoặc một hàm) là mã nghiêm ngặt. Mã ở mức cao nhất của tập lệnh (mã không có trong hàm) được coi là mã nghiêm ngặt khi tập lệnh chứa use strict chỉ thị. 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 use strict chỉ thị. Mã được chuyển đến eval() phương pháp được coi là mã nghiêm ngặt khi eval() được gọi từ mã nghiêm ngặt hoặc chứa use strict chỉ thị chính nó.

Chế độ nghiêm ngặt của ECMAScript 5 là một tập con bị hạn chế của ngôn ngữ JavaScript, giúp loại bỏ sự thiếu hụt có liên quan của ngôn ngữ và cá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 ở 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 chỉ định một giá trị cho một định danh không được khai báo là biến, hàm, tham số hàm, tham số catch-clause hoặc thuộc tính của toàn cục Object, sau đó bạn sẽ nhận được ReferenceError. Trong chế độ bình thường, mã định danh được khai báo ngầm định dưới dạng biến toàn cầu (như một thuộc tính của toàn cầu Object)
  • Trong chế độ nghiêm ngặt, từ khóa this có giá trị undefined trong các hàm được gọi là các hàm (không phải là các phương thức). (Ở chế độ bình thường this luôn luôn trỏ đến toàn cầu Object). Sự khác biệt này có thể được sử dụng để kiểm tra xem việc triển khai có hỗ trợ chế độ nghiêm ngặt hay không:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Ngoài ra khi một hàm được gọi với call() hoặc là apply ở chế độ nghiêm ngặt, sau đó this chính xác là giá trị của đối số đầu tiên của call()hoặc là apply() yêu cầu. (Ở chế độ bình thường null và undefined được thay thế bởi toàn cầu Object và các giá trị, không phải là đối tượng, được đúc thành các đối tượng.)

  • Ở chế độ nghiêm ngặt, bạn sẽ nhận được 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 mở rộng được. (Trong chế độ bình thường cả hai chỉ đơn giản là thất bại mà không có thông báo lỗi.)

  • Ở 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ể thực hiện nó ở chế độ bình thường). Thay vào đó, 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 eval() kết thúc thực hiện.
  • Trong chế độ nghiêm ngặt đối số-đối tượng của một hàm chứa một bản sao tĩnh của các giá trị, được chuyển đến hàm đó. Trong chế độ bình thường, đối số-đối tượng có hành vi hơi "huyền diệu": Các phần tử của mảng và tham số hàm được đặt tên tham chiếu cả hai giá trị giống nhau.
  • Ở chế độ nghiêm ngặt, bạn sẽ nhận được SyntaxError khi mà delete toán tử được theo sau bởi một định danh không đủ điều kiện (một biến, hàm hoặc tham số hàm). Ở chế độ bình thường, delete biểu thức sẽ không làm gì và được đánh giá false.
  • Ở chế độ nghiêm ngặt, bạn sẽ nhận được TypeError khi bạn cố gắng xóa thuộc tính không thể định cấu hình. (Ở chế độ bình thường, nỗ lực đơn giản là không thành công và deletebiểu thức được đánh giá false).
  • Trong chế độ nghiêm ngặt, nó được coi là một lỗi cú pháp khi bạn cố định nghĩa một số thuộc tính có cùng tên cho một đối tượng theo nghĩa đen. (Ở chế độ bình thường không có lỗi.)
  • Trong chế độ nghiêm ngặt, nó được coi là một 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 octal literals không được phép (đây là những chữ cái bắt đầu bằng 0x. (Trong chế độ bình thường, một số triển khai cho phép các số bát phân.)
  • Trong chế độ nghiêm ngặt, số nhận dạng eval và arguments được đối xử 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ố chức năng hoặc mã định danh của khối catch.
  • Trong chế độ nghiêm ngặt là nhiều hạn chế hơn về khả năng kiểm tra ngăn xếp cuộc gọi. arguments.caller và arguments.callee gây ra một TypeError trong một hàm ở chế độ nghiêm ngặt. Hơn nữa, một số thuộc tính người gọi và đối số của các hàm trong chế độ nghiêm ngặt gây ra một TypeError khi bạn cố gắng đọc chúng.

81
2018-05-15 06:58



"Trong chế độ nghiêm ngặt octal literals không được phép (đây là những literals bắt đầu bằng 0x ...)" octal literals bắt đầu với hàng đầu 0. - Alex Gittemeier