JavaScript

Strict Mode trong JavaScript là gì?

Strict Mode trong JavaScript là gì?
Được viết bởi Minh Hoàng

Series lập trình JavaScript, ngôn ngữ lập trình linh động, thực thi phía client.

Strict Mode trong JavaScript

1. Strict Mode (Chế độ nghiêm ngặt) là gì?

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

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ục
myFunction();

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?

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:

Ví dụ:
[code language=”javascript”]"use strict";
var x = 3.14;
delete x; // Error[/code] Try it »

– 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:

Ví dụ:
[code language=”javascript”]"use strict";
function x(p1, p1) {}; // Error[/code] Try it »

– Octal numeric literals là không được phép:

Ví dụ:
[code language=”javascript”]"use strict";
var x = 010; // Error[/code] Try it »

– Các ký tự Octal escape là không được phép:

Ví dụ:
[code language=”javascript”]"use strict";
var x = "\010"; // Error[/code] Try it »

– 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:

Ví dụ:
[code language=”javascript”]"use strict";
delete Object.prototype; // Error[/code] Try it »

– Không thể sử dụng “eval” làm biến:

Ví dụ:
[code language=”javascript”]"use strict";
var eval = 3.14; // Error[/code] Try it »

– Không thể sử dụng “arguments” làm biến:

Ví dụ:
[code language=”javascript”]"use strict";
var arguments = 3.14; // Error[/code] Try it »

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

Ví dụ:
[code language=”javascript”]"use strict";
with (Math){x = cos(2)}; // Error[/code] Try it »

– 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.

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »