Javascript là ngôn ngữ kịch bản có dấu được mã nguồn không?
A.
Không dấu được vì các kịch bản chạy ở client
B.
Dấu được vì chương trình hoạt động độc lập với trình duyệt
C.
Hai phát biểu đều sai
D.
Hai phát biểu đều đúng
Đáp án
Javascript là ngôn ngữ kịch bản (scripting language) chạy phía client (trình duyệt). Mã nguồn Javascript thường được gửi từ server đến trình duyệt của người dùng và thực thi tại đó. Vì vậy, mã nguồn này không được "dấu" theo nghĩa là bảo vệ khỏi việc xem hoặc sửa đổi bởi người dùng cuối. Người dùng có thể xem mã nguồn Javascript thông qua các công cụ phát triển của trình duyệt (Developer Tools). Do đó, phát biểu "Không dấu được vì các kịch bản chạy ở client" là chính xác.
Các lựa chọn khác:
- Phát biểu "Dấu được vì chương trình hoạt động độc lập với trình duyệt" là sai, vì Javascript *không* hoạt động độc lập với trình duyệt trong môi trường web.
- Vì có một phát biểu đúng (phát biểu 1), nên "Hai phát biểu đều sai" là sai.
- Vì có một phát biểu sai (phát biểu 2), nên "Hai phát biểu đều đúng" là sai.
Javascript là ngôn ngữ kịch bản (scripting language) chạy phía client (trình duyệt). Mã nguồn Javascript thường được gửi từ server đến trình duyệt của người dùng và thực thi tại đó. Vì vậy, mã nguồn này không được "dấu" theo nghĩa là bảo vệ khỏi việc xem hoặc sửa đổi bởi người dùng cuối. Người dùng có thể xem mã nguồn Javascript thông qua các công cụ phát triển của trình duyệt (Developer Tools). Do đó, phát biểu "Không dấu được vì các kịch bản chạy ở client" là chính xác.
Các lựa chọn khác:
- Phát biểu "Dấu được vì chương trình hoạt động độc lập với trình duyệt" là sai, vì Javascript *không* hoạt động độc lập với trình duyệt trong môi trường web.
- Vì có một phát biểu đúng (phát biểu 1), nên "Hai phát biểu đều sai" là sai.
- Vì có một phát biểu sai (phát biểu 2), nên "Hai phát biểu đều đúng" là sai.
Trong JavaScript, comment nhiều dòng được tạo bằng cách sử dụng cặp ký tự /* để bắt đầu comment và */ để kết thúc comment. Mọi thứ nằm giữa /* và */ sẽ được trình thông dịch JavaScript bỏ qua.
Phương án A sử dụng đúng cú pháp để tạo comment nhiều dòng. Các phương án khác sử dụng cú pháp không chính xác hoặc cú pháp của ngôn ngữ khác.
* Phương án B sử dụng //, đây là cú pháp cho comment một dòng.
* Phương án C sử dụng , đây là cú pháp comment trong HTML, không phải JavaScript.
Đoạn code sử dụng tính chất hoisting của JavaScript.
* **Hoisting:** Trong JavaScript, các khai báo biến và hàm được "đưa lên" đầu phạm vi của chúng trước khi code được thực thi. Tuy nhiên, chỉ có khai báo được đưa lên, còn việc gán giá trị thì không.
* **Phân tích code:**
* `console.log(duthaho)`: Tại dòng này, biến `duthaho` đã được khai báo (do hoisting) nhưng chưa được gán giá trị. Do đó, giá trị của nó là `undefined`.
* `duthaho = 69`: Gán giá trị 69 cho biến `duthaho`.
* `console.log("duthaho is " + duthaho)`: In ra "duthaho is 69" vì `duthaho` lúc này đã có giá trị là 69.
* `function duthaho() { ... }`: Đây là một khai báo hàm. Do hoisting, khai báo hàm này được đưa lên đầu phạm vi. Tuy nhiên, hàm này sẽ ghi đè giá trị của biến `duthaho` (đã gán giá trị 69 ở trên) bằng chính định nghĩa của hàm.
* `console.log(typeof duthaho)`: In ra kiểu dữ liệu của `duthaho`. Vì `duthaho` hiện đang tham chiếu đến một hàm, nên kiểu dữ liệu là "function".
* **Kết luận:**
* Dòng `console.log(duthaho)` đầu tiên in ra `undefined`.
* Dòng `console.log("duthaho is " + duthaho)` thứ hai in ra `duthaho is 69`.
Vậy, không có đáp án nào hoàn toàn chính xác. Đáp án gần đúng nhất là "duthaho is 69 function" nếu ta coi `console.log(duthaho)` đầu tiên không in ra gì, và dòng `console.log(typeof duthaho)` được hiểu là in ra giá trị của `duthaho` (là function).