03/10/2018, 16:56

Sự khác nhau giữa Function Scope và Block Scope trong Javascript

Trước khi đi vào nội dung bài viết, ta cùng nhìn lại các khái niệm cơ bản về var, let và const Sự khác nhau giữa var, let và const Dưới đây có 3 cách khai báo biến trong JavaScript var awidth = 100 ; let height = 200 ; const key = 'abc123' ; var Chính xác var là gì? ...

Trước khi đi vào nội dung bài viết, ta cùng nhìn lại các khái niệm cơ bản về var, let và const

Sự khác nhau giữa var, let và const

Dưới đây có 3 cách khai báo biến trong JavaScript

var awidth = 100;
let height = 200;
const key = 'abc123';

var

Chính xác var là gì? Nó có thể được gán lại và cập nhật. Ví dụ:

// Khai báo 1 biến
var awidth = 1000;

// Khi gọi tới awidth
awidth // sẽ trả về 1000

// Gán lại giá trị cho awidth và gọi lại nó
awidth = 200;
awidth // lúc này giá trị của awidth là 200

var là function scope. WTF?. Nghĩa là gì thế?. Nghĩa là nó chỉ có tác dụng trong phạm vi function nó được khai báo. Vậy khi khai báo nó bên ngoài function thì sao ? Đơn giản thì nó là biến toàn cục. Nếu khai báo 1 biến var bên trong function và gọi biến đó bên ngoài function thì biến đó không hoạt động ở phạm vi ngoài function Ví dụ:

function setWidth(){
    var awidth = 100;
    console.log(awidth);
}
awidth;
// Return:
Uncaught ReferenceError: awidth is not defined

Hiểu về Scope

Trước hết ta đến với 1 ví dụ:

var x = 100;
if (x > 12){
    var y = x * 2;
    console.log(y);
}

Ở ví dụ trên, console.log sẽ trả ra

200

Tiếp đến gọi y thì giá trị của nó là 200. Có gì sai sai rồi, y là biến toàn cục? Vì biến var là function scope và var y không khai báo bên trong function nên thay vào đó var được định nghĩa ở window hoặc biến toàn cục

Lợi ích khi sử dụng let và const ?

Để trả lời câu hỏi trên, thay vì hướng tới function thì ở đây ta hướng tới block. Vậy block là gì ? Nó là khối bên trong dấu {}

Vì vậy trong ví dụ trên, khi ta thay var y bằng let y sau đó gọi lại y nó sẽ trả về 1 error Uncaught ReferenceError: y is not defined.             </div>
            
            <div class=

0