# JS 01. Var - Let - Const

Hello! I'm Zu.Doan

Series này mình muốn note lại những kiến thức về Javascript (JS)

### var dùng như thế nào?

Từ khóa ```var``` được sử dụng để khai báo một biến trong JS

Biến được khai báo bằng ```var``` có một số đặc điểm như sau:

- (1) Biến đó sẽ có phạm vi toàn cục.
- (2) Biến đó sẽ có phạm vi cục bộ khi nằm trong hàm.
- (3) Biến đó có thể được khai báo lại hoặc ghi đè giá trị.
- (4) Biến đó sẽ được hoisting đồng thời được gán giá trị mặc định là ```undefined```

```
console.log(k); // In ra undefined - do k có được đặc tính (1) & (4) 
{
  console.log(k); // In ra undefined - do k có được đặc tính (1) & (4) 
  {
    {
      const l = 2;
      if(l == 2) {
        var k = 1; // Do k đã được hoisting nên trên đầu của scope nên đoạn này tương đương việc khai báo lại và gán giá trị cho k - do k có được đặc tính (3)
      }
    }

    console.log(k);
  }

  function sayHello() {
    var name = 'zu';
  }

  console.log(name); // Do ta gọi biến name ở ngoài function nên sẽ trả về lỗi ReferenceError: name is not defined - do k có đặc tính (2)
}
```

### let dùng như thế nào?

Từ khóa ```let``` được sử dụng để khai báo một biến trong JS

Biến được khai báo bằng ```let``` có một số đặc điểm như sau:
- (1) Biến đó sẽ có phạm vi block scope.
- (2) Biến đó có thể ghi đè giá trị.
- (3) Biến đó sẽ được hoisting, nhưng KHÔNG được gán giá trị mặc định là ```undefined``` (chỉ được khởi tạo nhưng không được gán giá trị => lỗi Reference error)

```
{
  console.log(k); // ReferenceError: k is not defined - do k có đặc tính (1) + (3)
    {
      const l = 2;
      if(l == 2) {
        let k = 1;
        k = 2; // Có thể ghi đè giá trị của k
        let k = 3; // Uncaught SyntaxError: Identifier 'k' has already been declared
      }
    }

    console.log(k); // ReferenceError: k is not defined - do k có đặc tính (1) + (3)
  }

  function sayHello() {
    var name = 'zu';
  }

  console.log(name); // Do ta gọi biến name ở ngoài function nên sẽ trả về lỗi ReferenceError: name is not defined - do k có đặc tính (2)
}
```

### const dùng như thế nào?

Từ khóa ```const``` được sử dụng để khai báo một biến trong JS

Biến được khai báo bằng ```const``` có một số đặc điểm như sau:
- (1) Biến đó sẽ có phạm vi block scope.
- (2) Biến đó KHÔNG thể ghi đè giá trị.
- (3) Biến đó sẽ được hoisting, nhưng KHÔNG được gán giá trị mặc định là ```undefined``` (chỉ được khởi tạo nhưng không được gán giá trị => lỗi Reference error)
