Chế độ nghiêm ngặt trong JavaScript

Trong hướng dẫn tự học JavaScript này, bạn sẽ học cách thực thi mã của mình ở chế độ nghiêm ngặt (Strict mode) trong JavaScript.

Chế độ nghiêm ngặt trong JavaScript

 

1. Strict mode là gì?

Chế độ nghiêm ngặt (Strict Mode) đã được giới thiệu trong ECMAScript 5 (ES5). Nó là một phiên bản ngôn ngữ JavaScript hạn chế hoặc chặt chẽ hơn về mặt ngữ nghĩa.

Nó sẽ báo lỗi ở một số ít lỗi mà trước đây được JS bí mật bỏ lỡ ( hoặc giải quyết và xử lý theo cách khác )

Ví dụ : Ở chính sách không khắt khe nếu bạn khởi tạo một biến mà không khai báo nó bằng từ khóa var ( ví dụ : x = 5 ; ), trình thông dịch JavaScript sẽ giả định rằng bạn đang tham chiếu đến một biến toàn cục và nếu không có biến nào như vậy sống sót, nó sẽ tự động hóa Tạo một cái. 😀

Ngoài ra, những tính năng không được dùng nữa cũng hoàn toàn có thể tạo ra lỗi trong chính sách khắt khe .

Do đó, chính sách khắt khe sẽ giảm lỗi, cải tổ bảo mật thông tin và hiệu suất tổng thể và toàn diện của ứng dụng của bạn .

2. Bật Strict Mode như thế nào?

Để bật Strict Mode, tất cả những gì bạn cần làm là chỉ cần thêm chuỗi “use strict” vào đầu tập lệnh của bạn, như được hiển thị trong ví dụ sau:

"use strict"; // Tất cả code của bạn sẽ ở dưới này x = 5; // ReferenceError: x is not defined console.log(x);

Nếu bạn thêm chỉ thị “use strict” làm dòng đầu tiên của chương trình JavaScript của mình, chế độ nghiêm ngặt sẽ áp dụng cho toàn bộ tập lệnh.

Tuy nhiên, bạn cũng hoàn toàn có thể bật chính sách khắt khe chỉ trong một hàm, như sau :

x = 5; console.log(x); // 5 function sayHello() { "use strict"; str = "Hello World!"; // ReferenceError: str is not defined console.log(str); } sayHello();

Lưu ý : Lệnh ” use strict ” chỉ được nhận dạng ở phần đầu của tập lệnh hoặc một hàm. Tất cả những trình duyệt văn minh đều tương hỗ thông tư ” use strict ” ngoại trừ IE 9 và những phiên bản thấp hơn. Và nếu, những trình duyệt không tương hỗ thông tư ” use strict ” sẽ bí mật bỏ lỡ nó và nghiên cứu và phân tích cú pháp JavaScript ở chính sách không khắt khe .

3. Những hạn chế chung trong chế độ nghiêm ngặt

Chế độ khắt khe đổi khác cả cú pháp và hành vi runtime. Trong những phần sau, tất cả chúng ta sẽ xem xét những hạn chế chung được thực thi trong chính sách khắt khe :

Các biến không được khai báo không được phép

Như bạn đã biế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 một giá trị cho một định danh không phải là một biến được khai báo, một lỗi ReferenceError sẽ được đưa ra.

"use strict"; function doSomething() { msg = "Xin chào!"; // ReferenceError: msg is not defined return msg; } console.log(doSomething());

Không cho phép xóa một biến hoặc một hàm

Trong chính sách khắt khe, nếu bạn cố gắng nỗ lực xóa một biến hoặc một hàm, một lỗi cú pháp sẽ được đưa ra .

Trong khi đó, ở chế độ không nghiêm ngặt, xóa biến hoặc xóa hàm là không thành công và biểu thức xóa được đánh giá là false.

"use strict"; var company = {name: "NIIT", age: 18}; delete company; // SyntaxError

Tương tự, khi bạn nỗ lực xóa một hàm ở chính sách khắt khe, bạn sẽ gặp lỗi cú pháp :

"use strict"; function sum(a, b) { return a + b; } delete sum; // SyntaxError

Không được phép có tham số trùng tên

Trong chính sách khắt khe, một lỗi cú pháp sẽ được ném ra, nếu một khai báo hàm có hai hoặc nhiều tham số trùng tên .

Ở chính sách không khắt khe, không xảy ra lỗi .

"use strict"; function square(a, a) { // SyntaxError return a * a; } console.log(square(2, 2));

Phương thức eval không thể thay đổi phạm vi

Trong chính sách khắt khe, vì nguyên do bảo mật thông tin, mã được chuyển đến eval ( ) không hề khai báo / sửa đổi những biến hoặc xác lập những hàm trong khoanh vùng phạm vi xung quanh như ở chính sách không khắt khe .

"use strict"; eval("var x = 5;"); console.log(x); // ReferenceError: x is not defined

Tên eval và arguments không thể được sử dụng làm định danh

 

Trong chế độ nghiêm ngặt, tên evalarguments được coi như từ khóa, vì vậy chúng không thể được sử dụng làm tên biến, tên hàm hoặc tên tham số hàm, v.v.

"use strict"; var eval = 10; // SyntaxError console.log(eval);

Câu lệnh with là không được phép

 

Trong chế độ nghiêm ngặt, câu lệnh with không được phép.

Câu lệnh with thêm những thuộc tính và phương pháp của đối tượng người tiêu dùng vào khoanh vùng phạm vi hiện tại. Vì vậy, những câu lệnh lồng bên trong câu lệnh with hoàn toàn có thể gọi trực tiếp những thuộc tính và phương pháp của đối tượng người tiêu dùng mà không cần tham chiếu đến nó .

"use strict"; // Không có câu lệnh with var radius1 = 5; var area1 = Math.PI * radius1 * radius1; // Sử dụng câu lệnh with var radius2 = 5; with(Math) { // SyntaxError var area2 = PI * radius2 * radius2; }

Không được phép ghi vào thuộc tính chỉ đọc

Trong chính sách khắt khe, việc gán giá trị cho thuộc tính không hề ghi, thuộc tính chỉ nhận hoặc thuộc tính không sống sót sẽ gây ra lỗi .

Trong chính sách không khắt khe, những nỗ lực này bí mật thất bại .

"use strict"; var company = {name: "NIIT", age: 18}; Object.defineProperty(company, "field", {value: "Education", writable: false}); company.field= "E-Commerce"; // TypeError

Không được phép thêm thuộc tính mới vào đối tượng không thể mở rộng

Trong chính sách khắt khe, những nỗ lực tạo thuộc tính mới trên những đối tượng người dùng không hề lan rộng ra hoặc không sống sót cũng sẽ gây ra lỗi. Nhưng trong chính sách không khắt khe, những nỗ lực này thất bại một cách bí mật .

"use strict"; var company = {name: "NIIT", age: 18}; console.log(Object.isExtensible(company)); // true Object.freeze(company); // Khóa đối tượng company console.log(Object.isExtensible(company)); // false company.field = "Education"; // TypeError

Số bát phân là không được phép

Ở chính sách khắt khe, số bát phân ( những số khởi đầu bằng số 0, ví dụ : 010,0377 ) là không được phép .

Mặc dù vậy, nó được tương hỗ trong toàn bộ những trình duyệt ở chính sách không khắt khe. Tuy nhiên, trong ES6, những số bát phân được tương hỗ bằng cách thêm tiền tố 0 o, tức là 0 o10, 0 o377, v.v.

"use strict"; var x = 010; // SyntaxError console.log(parseInt(x));

Bạn hoàn toàn có thể thấy rõ trong những ví dụ trên như thế nào khi ở chính sách khắt khe. Nó hoàn toàn có thể giúp bạn tránh mắc phải những lỗi thông dụng thường không được quan tâm trong khi viết một chương trình JavaScript .

Ngoài những thứ không được phép ở trên, strict mode còn

Không sử dụng từ khóa dành riêng đã được đặt chỗ cho các phiên bản trong tương lai để làm tên biến, tham số, hàm …

 

Như bạn đã biết từ những bài học kinh nghiệm trước, những từ khóa dành riêng không hề được sử dụng làm định danh ( tên biến, tên hàm và nhãn vòng lặp ) trong chương trình JavaScript .

Ngoài ra, ở chính sách khắt khe cũng áp đặt những hạn chế so với việc sử dụng những từ khóa được dành riêng cho tương lai .

Theo tiêu chuẩn ECMAScript 6 (hoặc ES6) mới nhất, các từ khóa này là từ khóa dành riêng, và trong chế độ nghiêm ngặt bạn không nên sử dụng nó để đặt tên hàm, tên biết,… awaitimplementsinterfacepackageprivateprotectedpublic, và static .

Tuy nhiên, để đạt được độ thích hợp cao nhất, bạn nên tránh sử dụng những từ khóa dành riêng làm tên biến hoặc tên hàm trong chương trình của mình .