- vừa được xem lúc

Hoisting trong JavaScript

0 0 7

Người đăng: BeautyOnCode

Theo Viblo Asia

Điều khiến JavaScript khó hiểu với những người mới hay chuyển từ ngôn ngữ khác qua chính là JavaScript cho phép sử dụng biến và hàm ngay cả trước cả khi bạn khai báo chúng.

Ví dụ ở đoạn code này:

1. console.log(a)
2. aFunction()
3. 4. var a = 3;
5. function aFunction() {
6. console.log("Hello")
7. }

Chương trình khi chạy không báo lỗi gì và kết quả in ra ở Console là:

undefined
Hello

Lưu ý ở đây mình dùng var , nếu sử dụng let hay const thì sẽ bị lỗi Uncaught ReferenceError: x is not defined vì với let hay const của ES6 thì chỉ sau khi bạn khai báo mới sử dụng được chúng.

Vậy điều gì đã khiến bạn có thể truy cập vào các biến và hàm ngay cả khi chúng chưa được khai báo?

Chính là cơ chế Hoisting trong JavaScript.

Vậy cụ thể thì hoisting là như thế nào?

Bạn có nhớ hai giai đoạn của một “Execution Context”Memory CreationCode Execution đã được giới thiệu trong bài “Điều gì xảy ra khi chạy một chương trình JavaScript” không?

Hoisting trong JavaScript được thực hiện trong giai đoạn cấp phát bộ nhớ – Memory Creation. Các biến và hàm sẽ được cấp bộ nhớ trước khi code được thực thi, biến được cấp bộ nhớ với giá trị undefined , còn hàm thì sẽ được cấp bộ nhớ cho toàn bộ nội dung bên trong hàm f aFunction().

Vì thế, bước vào giai đoạn thực thi Code Execution, thì các giá trị này đã có sẵn để sử dụng, nên gọi các hàm và biến này đã được hoist lên trước khi code được thực thi.


Bạn có thể kiểm tra trực tiếp trên devTools bằng cách đặt một breakpoint ngay tại dòng số 4, ngay trước khi code của biến và hàm được khai báo.

Khi chương trình chạy, gặp breakpoint dừng lại, hãy kiểm tra tab Global và tìm a , aFunction , tại đây tìm thấy biến a và hàm aFunction đã được cấp phát bộ nhớ và sẵn sàng để sử dụng.

Một lưu ý ở đây, nếu aFunction được khai báo ở dạng biểu thức dưới tên một biến

var aFunction = function() {}

thì aFunction sẽ có giá trị ban đầu là undefined như với một biến bình thường, và chương trình này sẽ báo lỗi.

Hoisting trong JavaScript sẽ dễ gây hiểu nhầm nếu bạn không hiểu về JavaScript Engine nên bạn cần tìm hiểu cơ chế này để dễ debug chương trình của mình nhé.

Thêm nữa, ở phiên bản ES6, cung cấp let và const để yêu cầu bạn chỉ sử dụng biến sau khi đã khai báo chúng nên sẽ tránh được các sử dụng không mong đợi như trên.

Vì thế, bạn nên ưu tiên sử dụng let và const thay thế cho var.

(Ref series Namaste JavaScript)


Bài viết gốc nằm ở blog cá nhân của mình, mời bạn ghé chơi.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Object trong Javascript

Xin chào mọi người,. Hôm nay mình sẽ giới thiệu về kiểu dữ liệu Object trong Javascript. Không để mọi người chờ lâu, cùng mình bắt đầu nào. .

0 0 39

- vừa được xem lúc

Bộ câu hỏi phỏng vấn Intern, Fresher cho Front-end từ A-Z

Mở đầu. Xin chào các bạn.

0 0 166

- vừa được xem lúc

Tối giản mã 1: If Boolean Then Boolean

Trong loạt bài này, chúng ta sẽ xem các tình trạng dư thừa phổ biến khiến mã của chúng ta trở nên phức tạp không cần thiết và khó đọc hơn, và chúng ta sẽ tìm hiểu cách tránh gặp phải. .

0 0 27

- vừa được xem lúc

Tối giản mã 2: Dư thừa Boolean

Kiểm tra các nguyên tắc của mã tối giản trong phần giới thiệu thử thách đầu tiên. Viết hàm trả về chuỗi "even" nếu số nguyên đã cho là chẵn và chuỗi "odd" nếu là số lẻ.

0 0 27

- vừa được xem lúc

Chiến lược tải, thực thi code JavaScript

Ba thành phần chính cấu tạo nên một trang web là HTML, CSS và JavaScript. CSS là ngôn ngữ về các kiểu áp dụng vào nội dung HTML để làm đẹp cho trang.

0 0 31

- vừa được xem lúc

UseState trong React Hook

useState() là một hook cơ bản giúp sử dụng state trong Functional Component. Hook này nhận vào input là một giá trị hoặc function và output là một mảng có hai phần tử tương ứng cho state và setState.

0 0 43