1. Use strict là gì?
Use strict mode trong javascript dịch sang tiếng việt thì có nghĩa là sử dụng sự nghiêm ngặt. Khi một đoạn lệnh được khai báo use strict thì tất cả các dòng code ở phía dưới dòng khai báo use strict sẽ được quản lý một cách nghiêm ngặt hơn về cú pháp.
x = 10; console.log(window.x); // => 10
Ở chế độ strict mode, bạn sẽ bị lỗi x chưa được định nghĩa: Uncaught ReferenceError: x is not defined.
x = 10; console.log(window.x); // => Uncaught ReferenceError: x is not defined
2. Các nghiêm ngặt của strict mode.
Khi sử dụng strict mode bạn sẽ không thể làm được những điều sau nữa:
Gán giá trị cho biến chưa được khai báo.
- Trong chế độ thường bạn có thể làm như này để gán giá trị cho một biến chưa khai báo
variable = "tranvanmy"; console.log(variable);
- Nhưng strict mode thì không thể:
"use strict" variable = "tranvanmy"; console.log(variable); // Uncaught ReferenceError: variable is not defined
- Để khắc phục được điều trên thì bạn cần phải khai báo biến với từ khóa var hoặc let.
"use strict" var variable = "tranvanmy"; // or let variable = "tranvanmy"; console.log(variable);
Báo lỗi khi sử dụng delete.
Nếu như ở chế độ thường thì bạn có thể xóa bất kỳ một thứ gì bằng từ khóa delete, mặc dù xóa được hay không nó cũng không báo lỗi. Nhưng khi sử dụng chế độ strict mode thì những thứ không thể xóa được nó sẽ báo lỗi ngay.
- Chế độ thường:
function getMyName (name) { console.log(name) } delete getMyName; //không có gì xảy ra mặc dù delete không xóa được hàm
- Chế độ strict mode:
"use strict" function getMyName (name){ console.log(name) } delete getMyName; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
Các tham số của hàm không được trùng nhau
Nếu như chế độ thường bạn có thể khai báo các tham số truyền vào hàm được phép trùng nhau thì giờ đây khi sử dụng chế độ strict mode thì nó sẽ báo lỗi ngay lập tức.
- Chế độ thường:
function getProfile (name, name, age){ //code } //chạy bình thường.
- Chế độ strict mode: “use strict”
function getProfile (name, name, age){ //code } //Uncaught SyntaxError: Duplicate parameter name not allowed in this context
Không cho phép khai báo biến dưới dạng hệ nhị phân.
Các số khai báo dưới dạng nhị phân hoặc có tiền tố prefix 0 đằng trước thì sẽ không được chấp nhận
- Chế độ thường:
var num = 010100101010101;
- Chế độ strict mode:
var num = 01010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode
Không được phép ghi đè lên thuộc tính chỉ được phép đọc.
- Chế độ thường:
var obj = {}; Object.defineProperty(obj, 'ver', {value: 1, writable: false}); obj.ver = 10; //không có gì xảy ra
- Chế độ strict mode:
"use strict" var obj = {}; Object.defineProperty(obj, 'ver', {value: 1, writable: false}); obj.ver = 10; //Uncaught TypeError: Cannot assign to read only property 'ver' of object '#<Object>' at data.php:14
Không sử dụng được with
- Chế độ thường:
var bar = 1; var foo = 2; with (bar){ console.log(foo); } //2
- Chế độ strict mode:
"use strict" var bar = 1; var foo = 2; with (bar){ console.log(foo); } //Uncaught SyntaxError: Strict mode code may not include a with statement
Không cho phép khai báo biến trong eval
Vì lý do bảo mật nên khi sử dụng strict mode thì bạn sẽ không thể nào có thể khai báo được biến bên trong nó nữa.
"use strict" eval ("var x = 4"); console.log(x); //Uncaught ReferenceError: x is not defined
Không chấp nhận khai báo các keyword
Ở chế độ strict mode thì các bạn sẽ không sử dụng được các từ khóa sau để khai báo làm tên biến, hằng,…
implements interface let package private protected public static yield arguments
3. Kết luận
Trên đây là một số lỗi thường gặp phải khi bạn sử dụng JavaScript ở strict mode. Nói vậy, không có nghĩa là tôi khuyên bạn tránh sử dụng strict mode. Ngược lại, chế độ này giúp bạn dễ dàng phát hiện lỗi. Và đây là sự đảm bảo cho code bạn không bị xung đột với những phiên bản JavaScript mới hơn sau này.
Xem thêm: