Tác giả NIIT - ICT HANOI
Ngày đăng 21/ 10/ 2020
Bình luận 0 Bình luận
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 (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ố lỗi mà trước đây được JS âm thầm bỏ qua (hoặc xử lý theo cách khác)
Ví dụ: Ở chế độ không nghiêm ngặt 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 tồn tại, nó sẽ tự động Tạo một cái. :D
Ngoài ra, các tính năng không được dùng nữa cũng có thể tạo ra lỗi trong chế độ nghiêm ngặt.
Do đó, chế độ nghiêm ngặt sẽ giảm lỗi, cải thiện bảo mật và hiệu suất tổng thể của ứng dụng của bạn.
Để 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 có thể bật chế độ nghiêm ngặt 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ả các trình duyệt hiện đại đều hỗ trợ chỉ thị "use strict" ngoại trừ IE 9 và các phiên bản thấp hơn. Và nếu, các trình duyệt không hỗ trợ chỉ thị "use strict" sẽ âm thầm bỏ qua nó và phân tích cú pháp JavaScript ở chế độ không nghiêm ngặt.
Chế độ nghiêm ngặt thay đổi cả cú pháp và hành vi runtime. Trong các phần sau, chúng ta sẽ xem xét các hạn chế chung được thực thi trong chế độ nghiêm ngặt:
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());
Trong chế độ nghiêm ngặt, nếu bạn cố gắng 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 cố gắng xóa một hàm ở chế độ nghiêm ngặt, bạn sẽ gặp lỗi cú pháp:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxError
Trong chế độ nghiêm ngặt, 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ế độ không nghiêm ngặt, không xảy ra lỗi.
"use strict";
function square(a, a) { // SyntaxError
return a * a;
}
console.log(square(2, 2));
Trong chế độ nghiêm ngặt, vì lý do bảo mật, mã được chuyển đến eval() không thể khai báo / sửa đổi các biến hoặc xác định các hàm trong phạm vi xung quanh như ở chế độ không nghiêm ngặt.
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined
Trong chế độ nghiêm ngặt, tên eval và arguments đượ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);
Trong chế độ nghiêm ngặt, câu lệnh with không được phép.
Câu lệnh with thêm các thuộc tính và phương thức của đối tượng vào phạm vi hiện tại. Vì vậy, các câu lệnh lồng bên trong câu lệnh with có thể gọi trực tiếp các thuộc tính và phương thức của đối tượ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;
}
Trong chế độ nghiêm ngặt, việc gán giá trị cho thuộc tính không thể ghi, thuộc tính chỉ nhận hoặc thuộc tính không tồn tại sẽ gây ra lỗi.
Trong chế độ không nghiêm ngặt, những nỗ lực này âm thầm 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
Trong chế độ nghiêm ngặt, các nỗ lực tạo thuộc tính mới trên các đối tượng không thể mở rộng hoặc không tồn tại cũng sẽ gây ra lỗi. Nhưng trong chế độ không nghiêm ngặt, những nỗ lực này thất bại một cách âm thầm.
"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
Ở chế độ nghiêm ngặt, số bát phân (các số bắt đầu bằng số 0, ví dụ: 010,0377) là không được phép.
Mặc dù vậy, nó được hỗ trợ trong tất cả các trình duyệt ở chế độ không nghiêm ngặt. Tuy nhiên, trong ES6, các số bát phân được hỗ trợ bằng cách thêm tiền tố 0o, tức là 0o10, 0o377, v.v.
"use strict";
var x = 010; // SyntaxError
console.log(parseInt(x));
Bạn có thể thấy rõ trong các ví dụ trên như thế nào khi ở chế độ nghiêm ngặt. Nó có thể giúp bạn tránh mắc phải những lỗi phổ biến thường không được chú ý 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
Như bạn đã biết từ các bài học trước, các từ khóa dành riêng không thể đượ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ế độ nghiêm ngặt cũng áp đặt các hạn chế đối 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,... await
, implements
, interface
, package
, private
, protected
, public
, và static
.
Tuy nhiên, để đạt được độ tương thích cao nhất, bạn nên tránh sử dụng các 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.