ES Series #1: Các Kiểu Khai Báo Biến Var vs Let vs Const.

ES Series #1: Các Kiểu Khai Báo Biến Var vs Let vs Const.

Một trong những tính năng nổi bật của ES6 đó là sự bổ sung letconst phục vụ cho việc khai báo biến dữ liệu.

Vậy tại sao lại cần tới let và const dù trước đó đã có var để khai báo biến, thì ở bài viết này chúng ta sẽ cùng tìm hiểu lý do của từng kiểu khai báo biến.

1. Function Scope vs Block Scope:

Đây là hai khái niệm bạn cần nắm rõ để có thể phân biệt:

Function Scope

Các biến Function Scope sẽ có tác dụng trong phạm vi của một function mà nó được khai báo bên trong. Ngoài ra, nếu bạn khai báo không nằm trong một hàm nào thì sẽ trở thành biến toàn cục (global variable).

function hello() {
   console.log('hello')
}

Block Scope

Các biến Block Scope sẽ có tác dụng trong phạm vi của một block mà nó được khai báo bên trong và các block con trong đó. Một block là đoạn code bên trong cặp dấu ngoặc nhọn:

if(true) {
   console.log('Hello');
}

2. Var

Tất cả các biến được khai báo với var đều là function scope. Điều này đồng nghĩ, nếu ta khai báo trong một block scope thì biến đó vẫn có thể truy cập được ở bên ngoài.

Ví dụ:

if(true) {
   var name = 'D.A.N_3002';
}

console.log(name);

Kết quả: 

D.A.N_3002

Ta thấy biến name được khai báo bên trong một block của hàm if, nhưng vì ta dùng var nên name là một biến function scope (ở đây là biến toàn cục) ==> Ta có thể truy cập nó từ bên ngoài.

3. Let

Tất cả các biến được khai báo với let đều là block scope, ta chỉ có thể truy cập vào biến khi ở cùng 1 block hoặc là các block con.

Ví dụ:

let name = 'Guest';

if(true) {
   let name = 'D.A.N_3002';
   console.log(name);
}

console.log(name);

Kết quả:

D.A.N_3002
Guest

Có thể thấy, đoạn code trên sẽ tạo ra 2 biến name ở 2 block scope khác nhau:

  • name = 'Guest' sẽ có scope là Global.
  • name = 'D.A.N_3002' sẽ có scope là block của lệnh if.
Và 2 hàm log cũng nằm trong 2 scope khác nhau ==> Kết quả in ra sẽ khác nhau (tùy thuộc vào scope của nó).

4. Const

Từ khóa này tương tự với let, chỉ khác là giá trị của biến sẽ không thể thay đổi. Ta không thể gán một giá trị mới cho biến được khai báo bằng const.

Ví dụ:

const name = 'D.A.N_3002';
name = 'New name';

Khi chạy, đoạn code trên sẽ trả về một lỗi như sau:

TypeError: Assignment to constant variable.

Tuy nhiên, nếu biến được khai báo bằng const là một object thì ta vẫn có thể thay đổi các thuộc tính trong object đó. Do đây không phải là gán một giá trị mới cho biến, mà chỉ là thay đổi bên trong biến.

Ví dụ:

const person = {
   name: 'Dinh Anh Nguyen',
   age: 17,
};
console.log(person.name);

person.name = 'D.A.N_3002';
console.log(person.name);

Kết quả:

Dinh Anh Nguyen
D.A.N_3002

5. Tổng kết:

Vậy khi nào thì bạn nên dùng var, let hoặc const. Điều này thì tùy vào mục đích của bạn, tuy nhiên mình có một số lời khuyên như sau:

  • Không nên sử dụng var vì từ khóa này rất khó xác định scope cụ thể của biến.
  • Sử dụng let khi biến đó cần phải thay đổi giá trị.
  • Sử dụng const khi biến đó không cần thay đổi giá trị (Config DB, nhập liệu từ người dùng,... ).

Cảm ơn mọi người đã đọc hết bài viết của mình, hy vọng rằng bài viết đã giúp bạn có cái nhìn tổng quát hơn về việc khai báo biến cũng như là phạm vi của biến trong ES6. Mong mọi người sẽ ủng hộ series tìm hiểu về các phiên bản ES này của mình, cũng như là góp ý để bài viết được tốt hơn.