2011-12-28 26 views
121

Tôi đã xem qua tài liệu tham khảo JavaScript trên Mạng nhà phát triển Mozilla và tôi đã xem một số nội dung có tên là "strict mode". Tôi đọc nó và tôi không hiểu nó làm gì. Ai đó có thể giải thích ngắn gọn (nói chung) mục đích của nó là gì và nó hữu ích như thế nào?"chế độ nghiêm ngặt" là gì và được sử dụng như thế nào?

+1

Liên quan: http://stackoverflow.com/q/1335851/1461424 – Krumia

Trả lời

135

Mục đích chính của nó là kiểm tra kỹ hơn.

Chỉ cần thêm "use strict"; vào đầu mã của bạn, trước bất kỳ điều gì khác.

Ví dụ: blah = 33; là JavaScript hợp lệ. Nó có nghĩa là bạn tạo một biến hoàn toàn toàn cầu blah.

Nhưng ở chế độ nghiêm ngặt, lỗi của nó là do bạn không sử dụng từ khóa "var" để khai báo biến.

Hầu hết thời gian bạn không có ý định tạo biến toàn cầu ở giữa phạm vi tùy ý, vì vậy phần lớn thời gian blah = 33 được viết là lỗi và lập trình viên không thực sự muốn là một biến toàn cục, chúng có nghĩa là viết var blah = 33.

Nó tương tự không cho phép nhiều thứ có giá trị kỹ thuật. NaN = "lol" không tạo ra lỗi. Nó cũng không thay đổi giá trị của NaN. sử dụng nghiêm ngặt điều này (và các câu lệnh kỳ lạ tương tự) tạo ra các lỗi. Hầu hết mọi người đánh giá cao điều này bởi vì không có lý do để bao giờ viết NaN = "lol", do đó, rất có thể là một lỗi đánh máy.

Read more at the MDN page on strict mode

+4

đây là bản sao chính xác của tài liệu tại MDN – nkcmr

+23

Bạn không hiểu gì về tiện ích của nó sau đó? Nó nhằm mục đích giúp phát triển bằng cách bắt những thứ có giá trị nhưng rất có thể là lỗi. –

20

chế độ nghiêm ngặt đã được bổ sung để có sẽ là một tập hợp con một cách dễ dàng tĩnh-phân tích được của ECMAScript đó sẽ là một mục tiêu tốt cho các phiên bản tương lai của ngôn ngữ. Chế độ nghiêm ngặt cũng được thiết kế với hy vọng rằng các nhà phát triển tự giới hạn mình vào chế độ nghiêm ngặt sẽ làm ít sai sót hơn và các lỗi họ thực hiện sẽ biểu hiện theo những cách rõ ràng hơn.

Harmony, hy vọng sẽ trở thành phiên bản chính tiếp theo của EcmaScript sẽ được xây dựng dựa trên ES5 nghiêm ngặt.

Hài hoà xây dựng trên chế độ nghiêm ngặt ES5 để tránh quá nhiều chế độ.

Một số thử nghiệm ngôn ngữ khác cũng phụ thuộc vào chế độ nghiêm ngặt. SES phụ thuộc vào khả năng phân tích của chế độ nghiêm ngặt của ES5.

SES (Secure ECMAScript) Thiết kế thí nghiệm

Thiết kế một Object Capability Ngôn ngữ lập trình bằng cách loại bỏ hoặc sửa chữa các tính năng trong ES5/Strict.

Cần có bản dịch thẳng từ SES sang ES5/Strict.

Annex C tiêu chuẩn giải thích sự khác biệt giữa chế độ nghiêm ngặt và chế độ bình thường.

Chế độ hạn chế nghiêm ngặt và các ngoại lệ

  • Các định danh "dụng cụ", "giao diện", "chúng ta hãy", "gói", "tin", "bảo vệ", "công cộng", "tĩnh ", và" lợi nhuận "được phân loại là mã thông báo FutureReservedWord trong mã chế độ nghiêm ngặt. (7.6.12 [?]).
  • Việc triển khai phù hợp, khi xử lý mã chế độ nghiêm ngặt, không được mở rộng cú pháp của NumericLiteral (7.8.3) để bao gồm OctalIntegerLiteral như được mô tả trong B.1.1.
  • Việc triển khai phù hợp, khi xử lý mã chế độ nghiêm ngặt (xem 10.1.1), không được mở rộng cú pháp của EscapeSequence để bao gồm OctalEscapeSequence như được mô tả trong B.1.2.
  • Chuyển nhượng cho số nhận dạng không khai báo hoặc tham chiếu không thể giải quyết được không tạo thuộc tính trong đối tượng chung. Khi một phép gán đơn giản xảy ra trong mã chế độ nghiêm ngặt, LeftHandSide của nó không được đánh giá đến một tham chiếu không thể giải quyết được. Nếu nó có một ngoại lệ ReferenceError được ném (8.7.2). LeftHandSide cũng có thể không phải là tham chiếu đến thuộc tính dữ liệu với giá trị thuộc tính {[[Có thể ghi]]: false}, cho thuộc tính accessor có giá trị thuộc tính {[[Set]]: undefined}, cũng như không tồn tại thuộc tính của một đối tượng có thuộc tính bên trong [[Extensible]] có giá trị false. Trong những trường hợp này, ngoại lệ TypeError được ném (11.13.1).
  • Số nhận dạng hoặc đối số có thể không xuất hiện dưới dạng LeftHandSideExpression của toán tử Assignment (11.13) hoặc PostfixExpression (11.3) hoặc UnaryExpression được điều hành bởi Tiền tố tăng (11.4.4) hoặc Giảm tiền tố (11.4. 5) toán tử. Đối số đối số cho các chức năng chế độ nghiêm ngặt xác định các thuộc tính accessor không thể cấu hình được đặt tên là "người gọi" và "callee" để ném ngoại lệ TypeError vào quyền truy cập (10.6).
  • Đối tượng đối số cho các chức năng chế độ nghiêm ngặt không tự động chia sẻ giá trị thuộc tính được lập chỉ mục mảng của chúng với các ràng buộc tham số chính thức tương ứng của các hàm của chúng. (10.6). Đối với các chức năng chế độ nghiêm ngặt, nếu đối tượng đối số được tạo, ràng buộc của đối số nhận dạng cục bộ đối với đối số đối số là không thay đổi và do đó có thể không phải là đích của biểu thức gán. (10.5).
  • Đây là một cú pháp SyntaxError nếu mã chế độ nghiêm ngặt chứa một ObjectLiteral với nhiều hơn một định nghĩa của bất kỳ tài sản dữ liệu (11.1.5). Nó là một cú pháp nếu nhận dạng "eval" hoặc định danh "đối số" xảy ra như định danh trong một PropertySetParameterList của một PropertyAssignment được chứa trong mã nghiêm ngặt hoặc nếu FunctionBody của nó là mã nghiêm ngặt (11.1.5).
  • Mã chế độ nghiêm ngặt không thể khởi tạo biến hoặc hàm trong môi trường biến của người gọi để đánh giá. Thay vào đó, một môi trường biến mới được tạo ra và môi trường đó được sử dụng để khai báo sự ràng buộc ràng buộc cho mã eval (10.4.2).
  • Nếu điều này được đánh giá trong mã chế độ nghiêm ngặt, thì giá trị này không bị ép buộc vào đối tượng. Giá trị này của null hoặc undefined không được chuyển đổi thành đối tượng chung và các giá trị nguyên thủy không được chuyển đổi thành các đối tượng bao bọc. Giá trị này được truyền qua một cuộc gọi hàm (bao gồm các cuộc gọi được thực hiện bằng Function.prototype.apply và Function.prototype.call) không ép buộc giá trị này truyền cho một đối tượng (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Khi toán tử xóa xảy ra trong mã chế độ nghiêm ngặt, cú pháp SyntaxError được ném nếu UnaryExpression của nó là tham chiếu trực tiếp đến biến, đối số hàm hoặc tên hàm (11.4.1).
  • Khi toán tử xóa xảy ra trong mã chế độ nghiêm ngặt, một lỗi TypeError được ném nếu thuộc tính bị xóa có thuộc tính {[[Configurable]]: false} (11.4.1). Nó là một cú pháp nếu một VariableDeclaration hoặc VariableDeclarationNoIn xảy ra trong mã nghiêm ngặt và định danh của nó là eval hoặc đối số (12.2.1).
  • Mã chế độ nghiêm ngặt có thể không bao gồm Mã xác nhận. Sự xuất hiện của một WithStatement trong bối cảnh như vậy là một SyntaxError (12.10). Đây là một cú pháp nếu một TryStatement với một Catch xảy ra trong mã nghiêm ngặt và định danh của sản xuất Catch là eval hoặc đối số (12.14.1)
  • Nó là một SyntaxError nếu nhận dạng eval hoặc đối số xuất hiện trong một FormalParameterList của chế độ nghiêm ngặt FunctionDeclaration hoặc FunctionExpression (13.1)
  • Chức năng chế độ nghiêm ngặt có thể không có hai hoặc nhiều tham số chính thức có cùng tên. Một nỗ lực để tạo ra một hàm như vậy bằng cách sử dụng một hàm dựng hàm FunctionDeclaration, FunctionExpression hoặc Function là một SyntaxError (13.1, 15.3.2).
  • Việc triển khai có thể không mở rộng, vượt ra ngoài quy định trong đặc điểm kỹ thuật này, ý nghĩa trong các chức năng chế độ nghiêm ngặt của thuộc tính có tên người gọi hoặc đối số của các thể hiện hàm. Mã ECMAScript không được tạo hoặc sửa đổi các thuộc tính với các tên này trên các đối tượng hàm tương ứng với các chức năng chế độ nghiêm ngặt (10.6, 13.2, 15.3.4.5.3).
  • Đây là cú pháp SyntaxError để sử dụng trong mã chế độ nghiêm ngặt số nhận dạng eval hoặc đối số làm Mã định danh của Hàm chức năng hoặc Hàm ExpressExpression hoặc dưới dạng tên tham số chính thức (13.1). Cố gắng xác định động một chức năng chế độ nghiêm ngặt như vậy bằng cách sử dụng hàm dựng (15.3.2) sẽ ném một ngoại lệ SyntaxError.
28

Một khía cạnh của chế độ nghiêm ngặt không được đề cập trong câu trả lời của Simon là chế độ nghiêm ngặt đặt this để undefined trong các chức năng gọi thông qua chức năng gọi.

điều Vì vậy, như thế này

function Obj() { 
    this.a = 12; 
    this.b = "a"; 
    this.privilegedMethod = function() { 
     this.a++; 
     privateMethod(); 
    }; 

    function privateMethod() { 
    this.b = "foo"; 
    } 
} 

sẽ gây ra một lỗi khi privateMethod được gọi là (vì bạn không thể thêm một tài sản để undefined), chứ không phải là vô ích thêm một tài sản b đến đối tượng toàn cầu.

+4

yeah cần thêm 'privateMethod.bind (this)();' và gọi với 'new' [' jsbin.com'] (https://jsbin.com/foyomo/edit?html,js,console) – hlcs

5

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

  • chế độ nghiêm ngặt sẽ loại bỏ một số lỗi JavaScript JavaScript bằng cách thay đổi chúng thành lỗi ném.

  • sửa lỗi chế độ nghiêm ngặt khiến các công cụ JavaScript khó thực hiện tối ưu hóa.

  • chế độ nghiêm ngặt 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.

1

ECMAScript5 giới thiệu một số đối tượng và đặc tính mới và còn gọi là "strict mode".

Chế độ nghiêm ngặt là tập hợp con của ngôn ngữ loại trừ các tính năng không dùng nữa.Chế độ nghiêm ngặt được chọn tham gia và không bắt buộc, có nghĩa là nếu bạn muốn mã của mình chạy ở chế độ nghiêm ngặt , bạn khai báo ý định sử dụng (một lần cho mỗi chức năng hoặc một lần cho toàn bộ chương trình ) chuỗi sau:

"use strict"; 
6

ECMAScript 5 giới thiệu các khái niệm về chế độ nghiêm ngặt.

Gọi chế độ nghiêm ngặt trong Mã

chế độ nghiêm ngặt áp dụng cho toàn bộ kịch bản hoặc chức năng cá nhân. Nó không áp dụng cho câu lệnh block được bao bọc trong {} niềng răng, cố gắng áp dụng nó vào các bối cảnh như vậy không có gì.

Toàn bộ Script:

Hãy nói chúng ta đang tạo app.js để thêm kịch bản sử dụng câu lệnh đầu tiên sẽ thi hành chế độ nghiêm ngặt cho toàn bộ mã.

// app.js whole script in strict mode syntax 
“use strict”; 
// Now you can start writing your code 

chế độ nghiêm ngặt đối với chức năng:

Để Gọi chế độ nghiêm ngặt cho một chức năng, đặt câu lệnh chính xác “sử dụng nghiêm ngặt”; trong phần đầu của hàm chức năng trước bất kỳ câu lệnh nào khác.

function yourFunc(){ 
"use strict"; 

// Your function code logic 
} 

Chế độ nghiêm ngặt kết hợp nhiều thay đổi đối với ngữ nghĩa thông thường của Javascript. Chế độ nghiêm ngặt đầu tiên loại bỏ một số lỗi JavaScript im lặng bằng cách thay đổi chúng để ném lỗi.

Ví dụ: Mã sử ​​dụng nghiêm ngặt chế độ

enter image description here

Trong ví dụ trên mã mà không sử dụng chế độ nghiêm ngặt trong mã Nó sẽ không ném ra một lỗi. Vì chúng ta đang truy cập biến số x mà không khai báo nó. Vì vậy, trong chế độ nghiêm ngặt truy cập biến không khai báo, hãy đưa ra một lỗi.

Bây giờ, hãy thử truy cập biến x mà không khai báo biến đó mà không có chế độ nghiêm ngặt.

(function(){ 
    x = 3; 
})(); 

// Will not throw an error 

Advantage của việc sử dụng chế độ nghiêm ngặt:

  • Loại bỏ Javascript lỗi im lặng bằng cách ném lỗi.
  • Khắc phục lỗi gây khó khăn cho công cụ JavaScript để thực hiện tối ưu hóa.
  • Làm cho mã chạy nhanh hơn đôi khi mã giống hệt không ở chế độ nghiêm ngặt
  • Cấm một số cú pháp có thể được xác định trong phiên bản ECMAScript trong tương lai.
0

2017 và cuối cùng tôi đã tìm thấy các tài liệu:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

chế độ nghiêm ngặt là một cách để tham gia vào một biến thể hạn chế của JavaScript. Chế độ nghiêm ngặt không chỉ là tập hợp con: nó có chủ đích khác nhau về ngữ nghĩa từ mã thông thường. Các trình duyệt không hỗ trợ chế độ nghiêm ngặt sẽ chạy mã chế độ nghiêm ngặt với các hành vi khác nhau từ các trình duyệt, do đó, không dựa vào chế độ nghiêm ngặt mà không có tính năng thử nghiệm để hỗ trợ cho các khía cạnh liên quan của chế độ nghiêm ngặt . Mã chế độ nghiêm ngặt và chế độ không nghiêm ngặt mã có thể cùng tồn tại, do đó, tập lệnh có thể chọn tham gia chế độ nghiêm ngặt từng bước.


chế độ nghiêm ngặt làm cho một số thay đổi ngữ nghĩa JavaScript bình thường. Đầu tiên, chế độ nghiêm ngặt loại bỏ một số lỗi JavaScript JavaScript bằng cách thay đổi chúng để phát hiện lỗi. Thứ hai, sửa lỗi chế độ nghiêm ngặt rằng khiến các công cụ JavaScript khó thực hiện tối ưu hóa: mã chế độ nghiêm ngặt đôi khi có thể được thực hiện để chạy nhanh hơn mã giống hệt không phải là chế độ nghiêm ngặt. Thứ ba, chế độ nghiêm ngặt nghiêm cấm một số cú pháp có khả năng được xác định trong các phiên bản tương lai của ECMAScript.

Các vấn đề liên quan