Strict Mode trong JavaScript
1. Strict Mode (Chế độ nghiêm ngặt) là gì?
– Strict Mode (Chế độ nghiêm ngặt) là một chế độ giúp bạn viết code JavaScript “bảo mật” (secure) dễ dàng hơn.
– Chế độ nghiêm ngặt thay đổi “cú pháp sai” đã được chấp nhận trước đó thành lỗi thực tế. Ví dụ: trong JavaScript bình thường, khi bạn viết hay sử dụng 1 biến “giữa trời” mà nó chưa được khai báo bằng 1 trong các từ khóa như var, let, hay const rồi gán giá trị cho nó, thì biến đó sẽ được JavaScript hiểu là 1 biến toàn cục. Trong chế độ nghiêm ngặt, điều này sẽ ném một lỗi, làm cho nó không thể “vô tình” tạo ra một biến toàn cục kiểu như vậy.
Ví dụ:
[code language=”javascript”]"use strict";x = 3.14; // Error[/code]
– Trong JavaScript bình thường, các lập trình viên sẽ không nhận được bất kỳ phản hồi lỗi nào khi chỉ định (gán) giá trị cho thuộc tính không thể ghi (non-writable).
– Trong chế độ nghiêm ngặt (Strict Mode), bất kỳ phép gán giá trị nào đến thuộc tính không thể ghi, thuộc tính chỉ getter (getter-only), thuộc tính không tồn tại (non-existing), biến không tồn tại hoặc đối tượng không tồn tại đều ném (throw) ra lỗi.
2. Cách khai báo Strict Mode
– Strict Mode được khai báo bằng cách thêm chỉ thị “use strict”; ở đầu tập lệnh script hoặc một function.
– Chỉ thị “use strict”; lần đầu được giới thiệu kể từ ECMAScript version 5, nó không phải là một câu lệnh mà là một literal expression.
– Mục đích của “use strict” là để chỉ ra rằng code sẽ được thực hiện trong “chế độ nghiêm ngặt” (strict mode). Khi có lỗi ở dòng nào sẽ thông báo lỗi và stop ngay tại dòng đó mà không thực hiện tiếp các câu lệnh bên dưới.
– Tất cả các trình duyệt hiện đại đều hỗ trợ “use strict” ngoại trừ Internet Explorer 9 và các phiên bản IE cũ hơn.
– Khi chỉ thị “use strict”; được khai báo ở đầu tập lệnh script, nó có phạm vi toàn cục (global scope) (tất cả mã trong tập lệnh sẽ thực thi ở chế độ nghiêm ngặt):
Ví dụ:
[code language=”javascript”]"use strict";x = 3.14; // Lỗi vì biến x chưa được khai báo
myFunction();
function myFunction() {
y = 3.14; // Lỗi vì biến y chưa được khai báo
}[/code]
Try it »
– Còn khi được khai báo bên trong một hàm, nó có phạm vi cục bộ (local scope) (chỉ phần code bên trong hàm này ở chế độ nghiêm ngặt):
Ví dụ:
[code language=”javascript”]x = 3.14; // Ở đây không lỗi, x lúc này trở thành biến toàn cụcmyFunction();
function myFunction() {
"use strict";
y = 3.14; // Lỗi vì biến y chưa được khai báo[/code]
Try it »
3. Điều gì không được phép ở chế độ nghiêm ngặt?
– Sử dụng một biến (kể cả biến thường hay biến object) chưa được khai báo là không được phép:
Ví dụ:
[code language=”javascript”]"use strict";x = 3.14; // Lỗi vì biến x chưa được khai báo[/code]
Ví dụ:
[code language=”javascript”]"use strict";x = {p1:10, p2:20}; // Lỗi vì y chưa được khai báo[/code] Try it »
– Xóa một biến (hay đối tượng) là không được phép:
– Xóa một hàm (function) là không được phép:
Ví dụ:
[code language=”javascript”]"use strict";function x(p1, p2) {};
delete x; // Error[/code] Try it »
– Hàm bị trùng lặp tên parameter là không được phép:
– Octal numeric literals là không được phép:
– Các ký tự Octal escape là không được phép:
– Không được phép ghi vào một thuộc tính chỉ đọc (read-only):
Ví dụ:
[code language=”javascript”]"use strict";var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // Error[/code] Try it »
– Không được phép ghi vào thuộc tính chỉ nhận (get-only):
Ví dụ:
[code language=”javascript”]"use strict";var obj = {get x() {return 0} };
obj.x = 3.14; // Error[/code] Try it »
– Xóa một thuộc tính khổng thể xóa (undeletable) là không được phép:
– Không thể sử dụng “eval” làm biến:
– Không thể sử dụng “arguments” làm biến:
– Câu lệnh “with” là không được phép:
– Vì lý do bảo mật, eval () không được phép tạo các biến trong phạm vi mà từ đó nó được gọi:
Ví dụ:
[code language=”javascript”]"use strict";eval ("var x = 2");
alert (x); // Error[/code] Try it »
★ Ngoài ra, không thể sử dụng các từ khóa dành riêng cho các phiên bản JavaScript trong tương lai dưới dạng tên biến ở chế độ nghiêm ngặt (strict mode.):
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
Ví dụ:
"use strict"; var public = 1500; // Error
Chỉ thị “use strict”; chỉ được nhận ra ở đầu tập lệnh script hoặc bắt đầu hàm.
[…] Xem thêm: Chế độ nghiêm ngặt (strict mode) trong JavaScript là gì? […]
[…] Chỉ thị “use strict” […]
[…] – Trong JavaScript, có chế độ “strict mode” không cho phép sử dụng các biến nếu chúng chưa được khai báo. – Xem thêm: Strict Mode trong JavaScript là gì? […]