Bỏ qua để đến nội dung

Hoisting

Hoisting là một cơ chế trong JavaScript, trong đó trình thông dịch (interpreter) sẽ đưa phần khai báo (declaration) của biến, hàm, hoặc class lên đầu phạm vi (scope) trước khi thực thi code.


Biến khai báo bằng var được đưa lên đầu phạm vi, nhưng giá trị thì giữ nguyên vị trí gán:

console.log(myVar); // undefined
var myVar = 5;
console.log(myVar); // 5
// Trình thông dịch hiểu như:
// var myVar; ← Khai báo được hoisting
// console.log(myVar); // undefined
// myVar = 5; ← Gán giá trị giữ nguyên
// console.log(myVar); // 5

Biến let/const cũng được hoisting, nhưng nằm trong Temporal Dead Zone (TDZ) — không thể truy cập trước khi khai báo:

console.log(myLet); // ReferenceError
let myLet = 10;
console.log(myConst); // ReferenceError
const myConst = 20;

Function declaration được hoisting toàn bộ (bao gồm cả phần thân hàm), do đó có thể gọi hàm trước khi khai báo:

sayHello(); // "Hello!"
function sayHello() {
console.log("Hello!");
}

var

Hoisting biến, giá trị mặc định undefined

let, const

Hoisting nhưng rơi vào TDZ, không thể truy cập trước khi khai báo

function declaration

Hoisting cả hàm (toàn bộ thân hàm)

function expression

Hoisting biến thôi, chưa gán giá trị nên không gọi được sớm