Chế độ nghiêm ngặt của thế giới là gì và nó được sử dụng như thế nào?


134

Tôi đã xem qua tài liệu tham khảo JavaScript trên Mạng của Nhà phát triển Mozilla và tôi đã tìm thấy một cái gì đó được gọi là "strict mode". Tôi đọc nó và tôi gặp khó khăn để hiểu những gì nó làm. 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 không?


Câu trả lời:


149

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

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

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

Nhưng trong chế độ nghiêm ngặt thì đó là lỗi 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ó nghĩa là tạo các biến toàn cục ở giữa một phạm vi tùy ý, do đó, 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 nó là biến toàn cục, ý họ là để viết var blah = 33.

Nó tương tự không cho phép rất nhiều thứ có giá trị kỹ thuật để làm. 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 tuyên bố kỳ lạ tương tự) tạo ra 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 để viết NaN = "lol", vì vậy rất có thể là một lỗi đánh máy.

Đọc thêm tại trang MDN ở chế độ nghiêm ngặt


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ó? Nó nhằm mục đích giúp phát triển bằng cách nắm bắt những thứ hợp lệ nhưng rất có thể là lỗi.
Simon Sarris

34

Một khía cạnh của chế độ nghiêm ngặt chưa được đề cập trong câu trả lời của Simon là chế độ nghiêm ngặt được đặt thisthành các undefinedhàm được gọi thông qua việc gọi hàm.

Những thứ 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 lỗi khi privateMethodđược gọi (vì bạn không thể thêm thuộc tính vào undefined), thay vì vô dụng thêm một thuộc btính vào đối tượng toàn cục.


4
vâng cần phải thêm privateMethod.bind(this)();và gọi vớinew jsbin.com
hlcs

Những hạn chế quan trọng nhất trong chế độ nghiêm ngặt: docs.microsoft.com/en-us/scripting/javascript/advified/ Kẻ
Krishna Mohan

21

Chế độ nghiêm ngặt đã được thêm vào để có một tập hợp con dễ dàng phân tích tĩnh của EcmaScript, đây sẽ là mục tiêu tốt cho các phiên bản ngôn ngữ trong tương lai. 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 chế độ nghiêm ngặt sẽ ít mắc lỗi 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.

Harmony 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 ES5.

Thí nghiệm thiết kế SES (Secure ECMAScript)

Thiết kế một ngôn ngữ lập trình khả năng đối tượng 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ó một bản dịch thẳng từ SES sang ES5 / Strict.

Phụ lục C của 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.

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

  • Các định danh "thực hiện", "giao diện", "cho phép", "gói", "riêng tư", "được bảo vệ", "công khai", "tĩnh" và "sản lượng" được phân loại là các mã thông báo FutureReservedWord trong mã chế độ nghiêm ngặt. (7.6.12 [?]).
  • Việc triển khai tuân thủ, khi xử lý mã chế độ nghiêm ngặt, có thể không mở rộng cú pháp NumericLiteral (7.8.3) để bao gồm OctalIntegerLiteral như được mô tả trong B.1.1.
  • Việc triển khai tuân thủ, khi xử lý mã chế độ nghiêm ngặt (xem 10.1.1), có thể không mở rộng cú pháp của EscapeSequence để bao gồm OctalEscapeSequence như được mô tả trong B.1.2.
  • Việc gán cho một định danh không được khai báo hoặc tham chiếu không thể giải quyết khác không tạo ra một thuộc tính trong đối tượng toàn cầu. 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á thành một Tham chiếu không thể giải quyết được. Nếu nó thực hiện một ngoại lệ ReferenceError (8.7.2). LeftHandSide cũng có thể không phải là tham chiếu đến thuộc tính dữ liệu có giá trị thuộc tính {[[Writable]]: false}, với thuộc tính của trình truy cập có giá trị thuộc tính {[[Set]]: không xác định}, cũng không phải là 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 [[Mở rộng]] có giá trị sai. Trong những trường hợp này, một ngoại lệ TypeError được đưa ra (11.13.1).
  • Mã định danh hoặc đối số có thể không xuất hiện dưới dạng LeftHandSideExpression của toán tử chuyển nhượng (11.13) hoặc của PostfixExpression (11.3) hoặc dưới dạng UnaryExpression được vận hành bởi toán tử tiền tố (11.4.4) hoặc toán tử tiền tố (11.4.4) . Các đối tượng đối số cho các chức năng chế độ nghiêm ngặt xác định các thuộc tính của trình truy cập không thể cấu hình được đặt tên là "người gọi" và "callee", ném ngoại lệ TypeError khi truy cập (10.6).
  • Các đối tượng đối số cho các hàm chế độ nghiêm ngặt không tự động chia sẻ các 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 hàm chế độ nghiêm ngặt, nếu một đối tượng đối số được tạo, ràng buộc của các đối số định danh cục bộ với đối tượng đối số là bất biến và do đó có thể không phải là mục tiêu của biểu thức gán. (10,5).
  • Đó là một SyntaxError nếu mã chế độ nghiêm ngặt chứa ObjectLiteral có nhiều hơn một định nghĩa của bất kỳ thuộc tính dữ liệu nào (11.1.5). Đó là một SyntaxError nếu Mã định danh "eval" hoặc "đối số" định danh xảy ra dưới dạng Mã định danh trong Property setParameterList của PropertyAssocation đượ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ã eval chế độ nghiêm ngặt không thể khởi tạo các biến hoặc hàm trong môi trường biến của người gọi để eval. Thay vào đó, một môi trường biến mới được tạo và môi trường đó được sử dụng để khai báo 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 đối tượng. Giá trị null hoặc không xác định này không được chuyển đổi thành đối tượng toàn cục và giá trị nguyên thủy không được chuyển đổi thành đối tượng trình bao bọc. Giá trị này được truyền qua một lệnh gọi hàm (bao gồm các lệnh được thực hiện bằng Function.prototype.apply và Function.prototype.call) không ép buộc giá trị này được truyền cho một đối tượng (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Khi một toán tử xóa xảy ra trong mã chế độ nghiêm ngặt, SyntaxError sẽ bị ném nếu UnaryExpression của nó là tham chiếu trực tiếp đến một 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, TypeError sẽ bị ném nếu thuộc tính cần xóa có thuộc tính {[[Có thể cấu hình]]: false} (11.4.1). Đó là một SyntaxError nếu Var biếnDeclaration hoặc Var biếnDeclarationNoIn xảy ra trong mã nghiêm ngặt và Mã đị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 WithStatement. Sự xuất hiện của WithStatement trong bối cảnh như vậy là SyntaxError (12.10).
  • Đó là một SyntaxError nếu TryStatement with Catch xảy ra trong mã nghiêm ngặt và Mã định danh của sản xuất Catch là eval hoặc argument (12,14.1)
  • Đó là một SyntaxError nếu mã định danh eval hoặc đối số xuất hiện trong một FormParameterList của chế độ nghiêm ngặt FunctionDeclaration hoặc FunctionExpression (13.1)
  • Hàm 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 Hàm xây dựng hàm, hàm ExpressExpression hoặc hàm tạo 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 tả này, ý nghĩa trong các chức năng chế độ nghiêm ngặt của các thuộc tính có tên người gọi hoặc đối số của các thể hiện chức năng. 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 hàm chế độ nghiêm ngặt (10.6, 13.2, 15.3.4.5.3).
  • Đó là một SyntaxError để sử dụng trong mã chế độ nghiêm ngặt, các định danh eval hoặc các đối số là Mã định danh của FunctionDeclaration hoặc FunctionExpression hoặc như một tên tham số chính thức (13.1). Cố gắng tự động xác định một chức năng chế độ nghiêm ngặt như vậy bằng cách sử dụng hàm tạo (15.3.2) sẽ tạo ra ngoại lệ SyntaxError.

6

ECMAScript 5 đã giới thiệu khái niệm 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ộ tập lệnh hoặc cho từng chức năng. Nó không áp dụng cho câu lệnh chặn được bao trong {} dấu ngoặc, cố gắng áp dụng nó cho các bối cảnh như vậy không có gì.

Toàn bộ tập lệnh:

Giả sử chúng tôi đang tạo app.js để thêm tập lệnh sử dụng câu lệnh đầu tiên sẽ thực thi 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 cho chức năng:

Để 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; trong phần đầu của hàm cơ thể 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 một số thay đổi đối với ngữ nghĩa Javascript thông thường. Chế độ nghiêm ngặt đầu tiên loại bỏ một số lỗi im lặng JavaScript bằng cách thay đổi chúng để ném lỗi.

Đối với trường hợp: Mã sử ​​dụng Chế độ nghiêm ngặt

nhập mô tả hình ảnh ở đây

Trong ví dụ mã ở trên mà không sử dụng chế độ nghiêm ngặt trong mã Nó sẽ không gây ra lỗi. Như chúng ta đang truy cập biến xmà 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 ném một lỗi.

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

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

// Will not throw an error

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

  • Loại bỏ lỗi im lặng JavaScript bằng cách ném lỗi.
  • Sửa 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 đôi khi nhanh hơn mã giống hệt không ở chế độ nghiêm ngặt
  • Cấm một số cú pháp có khả năng được xác định trong phiên bản tương lai của ECMAScript.

5

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.

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

  • Chế độ nghiêm ngặt sửa các lỗi khiến 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à tính chất mới và cái gọi là "strict mode" .

Chế độ nghiêm ngặt là tập hợp con của ngôn ngữ không bao gồm các tính năng không dùng nữa. Chế độ nghiêm ngặt là chọn tham gia và không bắt buộ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 của mình bằng cách 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";

1

2017 và cuối cùng tôi đã tìm thấy 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 để chọn tham gia vào một biến thể hạn chế của JavaScript. Chế độ nghiêm ngặt không chỉ là một tập hợp con: nó cố ý có ngữ nghĩa khác với 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 với các trình duyệt khác, vì vậy đừng dựa vào chế độ nghiêm ngặt mà không kiểm tra tính năng để 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à mã chế độ không nghiêm ngặt có thể cùng tồn tại, do đó các tập lệnh có thể tăng dần vào chế độ nghiêm ngặt.


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. Đầu tiên, chế độ nghiêm ngặt sẽ loại bỏ một số lỗi im lặng JavaScript bằng cách thay đổi chúng để ném lỗi. Thứ hai, chế độ nghiêm ngặt sửa các lỗi 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ó thể được xác định trong các phiên bản tương lai của ECMAScript.


0

Câu hỏi:
Sau đây là vấn đề tôi gặp phải, tôi đã theo một hướng dẫn và cuối cùng nó đã cố gắng biên dịch scsstệp sau và cố gắng tạo mã CSS từ nó,

.fatty{
  width: percentage(6/7);
}

sử dụng gulpfile.jstác vụ sau :

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

Vì vậy, lỗi tôi nhận được là như sau:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

Giải pháp:
Vì vậy, nó hiển thị cho tôi index.jstệp nằm trong mô-đun gulp-sass của tôi (về cơ bản đã bị khóa và không nên chỉnh sửa). Nhưng nếu tôi đi mạnh mẽ và thêm phần "use_strict"trên cùng của index.jstập tin đó, nó sẽ chạy nhiệm vụ của tôi một cách trơn tru.

Tôi bất lực, vì vậy tôi tiếp tục sử dụng điều này như một giải pháp! Nhưng sau khi xem qua một số câu hỏi và trả lời khác của SO , tôi đã thấy câu trả lời như sau:

sudo npm install -g n
sudo n stable

và sớm hơn tôi đã cập nhật NodeJs của mình (lên Phiên bản 10.x), và sau đó xây dựng lại Gulp bằng cách chạy các lệnh như Terminal hướng dẫn tôi:

npm rebuild node-sass --force

Và tất cả đều ổn. Vì vậy, đó là cách nó đã được giải quyết. Tôi hoàn tác các thay đổi tôi đã làm cho index.jstệp mô-đun gulp. Và bây giờ nó chạy trơn tru.

Hy vọng câu trả lời này sẽ hữu ích cho ai đó ngoài kia!

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.