--- title: Hoisting slug: Tu-dien-thuat-ngu/Hoisting tags: - JavaScript translation_of: Glossary/Hoisting ---
Hoisting là một thuật ngữ mà bạn sẽ không tìm thấy cách sử dụng trong bất cứ văn bản đặc tả quy chuẩn nào trước ECMAScript® 2015 Language Specification. Hoisting được nghĩ đến như một cách chung trong việc thực thi các ngữ cảnh (đặc biệt là giai đoạn tạo và thực thi) làm việc như thế nào trong JavaScript. Nhưng, hoisting có thể dẫn đến nhiều sự hiểu lầm. Ví dụ, hoisting dạy rằng định nghĩa biến và hàm được chuyển tới đầu đoạn mã của bạn, nhưng đây không hẳn là tất cả những gì xảy ra. Chuyện gì xảy ra khi các định nghĩa biến và hàm đó được lưu vào bộ nhớ trong suốt giai đoạn biên dịch, nhưng ở chính xác nơi bạn đã gõ nó trong đoạn mã của bạn?
Một trong những lợi ích của việc đặt định nghĩa hàm JavaScript vào bộ nhớ trước khi nó thực thi bất cứ đoạn mã nào thì nó cho phép bạn sử dụng một hàm trước khi bạn định nghĩa nó trọng code của bạn. Ví dụ:
function catName(name) { console.log("My cat's name is " + name); } catName("Tigger"); /* The result of the code above is: "My cat's name is Tigger" */
Đoạn code ở trên là cách bạn mong muốn khi viết mã để nó hoạt động. Bây giờ, hãy xem điều gì xả ra khi chúng ta gọi hàm trước khi chúng ta viết nó:
catName("Chloe"); function catName(name) { console.log("My cat's name is " + name); } /* The result of the code above is: "My cat's name is Chloe" */
Thậm chí chúng ta gọi hàm trong mã của chúng ta đầu tiên, trước khi hàm được viết thì mã vẫn hoạt động. Đây là vì cách mà thực thi ngữ cảnh hoạt động trong JavaScript.
Hoisting hoạt động tốt với những kiểu dữ liệu khác và các biến. các biến có thể được khởi tạo và được sử dụng trước khi định nghĩa. nhưng chúng có thể không được sử dụng mà không kèm khởi tạo.
num = 6; num + 7; var num; /* gives no errors as long as num is declared*/
JavaScript chỉ đưa các định nghĩa chứ không phải các khởi tạo. Nếu bạn đang sử dụng một biến mà được định nghĩa và khởi tạo sau khi sử dụng, giá trị sẽ là undefined. Hai ví dụ dưới đây mô tả cùng hành vi.
var x = 1; // Initialize x console.log(x + " " + y); // '1 undefined' var y = 2; // Initialize y // The following code will behave the same as the previous code: var x = 1; // Initialize x var y; // Declare y console.log(x + " " + y); // '1 undefined' y = 2; // Initialize y