Codestus.com

Go back

Góc nhìn trực quan về Javascript: Hoisting

Published at: 13/04/2021

4 mins read

Hoisting là một trong những thuật ngữ thông dụng mà lập trình viên JS đều phải nghe qua. Vậy Hoisting là gì trong javascript mà nó lại biến thành một thuật ngữ được tìm kiếm nhiều đến vậy.

Hoisting là gì?

Nếu bạn là một người mới tiếp cận với ngôn ngữ JavaScript (JS), bạn có thể bắt gặp những hành vi "kỳ lạ" như khi gán một biến trước khi khai báo chúng. Đó được gọi là HoistingHoisting thường được giải thích là đặt các biến và hàm lên đầu tệp nhưng không, đó không phải là những gì thực sự xảy ra, nhưng hành vi có thể giống như vậy.

Khi JS Engine thực thi, điều đầu tiên là thiết lập bộ nhớ cho dữ liệu trong mã của chúng ta. Không có mã nào được thực thi tại thời điểm này, nó chỉ đơn giản là chuẩn bị mọi thứ sau đó mới thực thi. Cách khai báo hàm và biến được lưu trữ khác nhau. Các hàm được lưu trữ với một tham chiếu đến toàn bộ hàm.

Ví dụ về function trong Hoisting

Với biến, nó có một chút khác biệt. Giới thiệu chút về ES6 ta có 2 dạng khai báo mới là letconst. Những biến khái báo với let hoặc const được lưu trữ chưa khởi tạo stored unitialized.

Ví dụ Hoisting

Những biến khai báo với var sẽ được lưu trữ với giá trị mặc định là undefined.

Ví dụ Hoisting

Bây giờ giai đoạn thiết lập đã xong, đến phần thực thi các đoạn mã trong mã nguồn của bạn. Hãy xem xét điều gì sẽ xảy ra nếu chúng ta đặt console.log lên đầu tệp mã javascript, trước khi chúng ta khai báo các function hoặc bất kì biến nào khác.

Các function được lưu trự dưới dạng tham chiếu đến toàn bộ mã của hàm, chúng ta có thể gọi chúng ngay cả trước khi dòng mà chúng ta tạo ra chúng.

Ví dụ hoisting với function

Khi chúng ta tham chiếu đến một biến được khai báo với var trước khi chúng được khai báo, đơn giản nó sẽ trả về kết quả undefined đã được lưu trữ trong quá trình thiết lập. Tuy nhiên, điều này cũng có thể dẫn đến kết quả unexpected. Trong hầu hết các trường hợp, điều này có nghĩa là bạn đang vô tình tham chiếu đến nó (có thể bạn không muốn nó thực sự có giá trị không xác định).

Ví dụ hoisting

Để tránh việc có thể vô tình tham chiếu đến một biến undefined, giống như chúng ta có thể làm với từ khoá var, một ReferenceError sẽ xuất hiện bất cứ khi nào chúng ta cố gắng truy cập vào các biến chưa được khởi tạo. "Vùng" trước khi khai báo thực tế của chúng, được gọi là vùng chết tạm thời: bạn không thể tham chiếu các biến (điều này bao gồm cả các lớp ES6!) trước khi khởi tạo chúng

Ví dụ hoisting

Khi JS Engine thực thi đến dòng mà chúng ta đã khai báo các biến, các giá trị trong bộ nhớ sẽ được ghi đè bằng các giá trị mà chúng ta gán cho chúng

Ví dụ hoisting

Có thể bạn sẽ cần