Web Cơ Bản

Chế độ nghiêm ngặt (Strict Mode) trong JavaScript

- Khi trình duyệt thực thi một chương trình JavaScript, nó sẽ bỏ qua những lỗi lặt vặt

Ví dụ:

- Trong đoạn mã bên dưới, câu lệnh str = "Lập Trình Web" có thể được hiểu theo hai nghĩa:

  • (1) Khai báo biến str với giá trị là chuỗi Lập Trình Web.
  • (2) Gán cho biến str giá trị là chuỗi Lập Trình Web.

- Tuy nhiên, cho dù hiểu theo nghĩa nào đi nữa thì câu lệnh vẫn còn thiếu sót, ví dụ:

  • Nếu nói về khai báo biến thì câu lệnh còn thiếu từ khóa var.
  • Nếu nói về gán giá trị thì biến str chưa được khai báo trước đó.

 ==> Thế nhưng trình duyệt đã bỏ qua lỗi lặt vặt đó và chương trình vẫn thực thi bình thường


<script>
    str = "Lập Trình Web";
    document.write(str);
</script>
Xem ví dụ

- Việc trình duyệt bỏ qua những lỗi lặt vặt thường không gây ra ảnh hưởng nghiêm trọng. Tuy nhiên, ở một số trường hợp, nó sẽ phát sinh những điều mà ta không mong muốn.

Ví dụ:

- Ở đoạn mã bên dưới, biến str được khai báo bên trong hàm Hello, nên đáng ra nó phải là biến cục bộ của hàm Hello và chỉ có thể sử dụng bên trong hàm Hello.

- Tuy nhiên, do thiếu từ khóa var nên str trở thành biến toàn cục và nó có thể bị sử dụng ở phạm vị nằm ngoài hàm Hello.


<script>

    function Hello(){
        str = "Lập Trình Web";
        document.getElementById("a").innerHTML = "Xin chào: " + str;
    }

    Hello();

    document.getElementById("b").innerHTML = str; //Biến str bị sử dụng ngoài hàm

</script>
Xem ví dụ

Để đảm bảo tránh tình trạng phát sinh những điều không mong muốn thì ta cần phải thiết lập chế độ nghiêm ngặt trong việc viết mã lệnh JavaScript

1) Cách thiết lập chế độ nghiêm ngặt

- Để thiết lập chế độ nghiêm ngặt, ta đặt cụm từ "use strict"; ở vị trí đầu tiên trong chương trình.

Ví dụ:

- Chương trình JavaScript bên dưới đã được thiết lập chế độ nghiêm ngặt.

- Do đó, các lỗi cú pháp lặt vặt sẽ không được bỏ qua.


<script>

    "use strict";

    str1 = "Lập Trình Web"; //Câu lệnh này bị lỗi

    function Hello(){
        str2 = "Xin chào JavaScript"; //Câu lệnh này bị lỗi
    }

</script>

- Lưu ý: Nếu cụm từ "use strict"; được đặt bên trong hàm thì nó chỉ dùng để thiết lập chế độ nghiêm ngặt cho hàm đó.

Ví dụ:

<script>

    str1 = "Lập Trình Web"; //Câu lệnh này KHÔNG bị lỗi

    function Hello(){
        "use strict";
        str2 = "Xin chào JavaScript"; //Câu lệnh này bị lỗi
    }

</script>

2) Những điều không được phép trong chế độ nghiêm ngặt

- Chế độ nghiệm ngặt bắt buộc người lập trình viên phải viết mã lệnh JavaScript theo đúng quy tắc cú pháp tiêu chuẩn để đảm bảo sự an toàn cho chương trình (giúp chương trình tránh được những cú pháp không tốt dẫn đến trường hợp bị lỗi).

- Ví dụ như trong một chương trình JavaScript bình thường, khi ta gán giá trị cho một biến chưa được khai báo thì biến đó sẽ trở thành biến toàn cục. Tuy nhiên, trong chế độ nghiêm ngặt, việc gán giá trị cho một biến chưa được khai báo sẽ bị lỗi, điều này giúp ta tránh được tình trạng tạo một biến toàn cục không mong muốn.

- Dưới đây là những điều mà bạn không được làm trong một chương trình đã được thiết lập chế độ nghiêm ngặt:

- (1) Không được gán giá trị cho một biến (hoặc mảng, đối tượng, ....) khi nó chưa được khai báo.

Ví dụ:

<script>
    "use strict";
    a = "Lập Trình Web"; //Câu lệnh này bị lỗi
    b = ["HTML", "CSS", "JavaScript"]; //Câu lệnh này bị lỗi
    c = {fullName:"Nguyễn Thành Nhân", year:1993}; //Câu lệnh này bị lỗi
</script>

- (2) Không được phép xóa: biến, mảng, đối tượng, hàm, ....

Ví dụ:

<script>
    "use strict";
    var a = "Lập Trình Web";
    function b(){
        alert("hello");
    }
    delete a; //Câu lệnh này bị lỗi
    delete b; //Câu lệnh này bị lỗi
</script>

- (3) Trong việc khai báo hàm, các tham số của hàm không được trùng tên nhau.

Ví dụ:

<script>
    "use strict";
    function ThongTin(name,name){alert("Tôi là " + name + " sinh năm " + name)}; //Lỗi
</script>

- (4) Một giá trị là số thì không được bắt đầu bằng số 0.

Ví dụ:

<script>
    "use strict";
    var year = 01993; //Câu lệnh này bị lỗi
</script>

- (5) Không được cập nhật giá trị của một thuộc tính chỉ có thể đọc

- Lưu ý: Câu lệnh Object.defineProperty(SinhVien, "year", {writable:false}) trong kịch bản bên dưới dùng để thiết lập thuộc tính year của đối tượng SinhVien chỉ có thể dùng để đọc.

Ví dụ:

<script>
    "use strict";
    var SinhVien = {name:"Nguyễn Thành Nhân", year:1993};
    Object.defineProperty(SinhVien, "year", {writable:false});
    SinhVien.year = 2017; //Câu lệnh này bị lỗi
    document.write(SinhVien.year);
</script>

- (6) Không được sử dụng các từ dưới đây để đặt tên cho biến:

  • eval
  • arguments
  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
Ví dụ:

<script>
    "use strict";
    var public = "Lập Trình Web"; //Câu lệnh này bị lỗi
</script>