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

Hoisting trong JavaScript là gì?

0 0 1

Người đăng: Vũ Tuấn

Theo Viblo Asia

Tôi từng nghe nhiều người nói: "JavaScript hoists (kéo lên) các biến và hàm", và thật lòng mà nói… điều đó chỉ khiến tôi rối thêm.

Nhưng một khi tôi thấy nó hoạt động thực tế, thì mọi thứ mới thực sự sáng tỏ.

Trong bài viết này, tôi sẽ giải thích hoisting thực sự là gì, nó hoạt động như thế nào phía sau hậu trường, và cách nó có thể khiến bạn "vấp ngã" trong các buổi phỏng vấn.

Hoisting là gì?

Hoisting là cách JavaScript đọc code của bạn trước khi nó thực sự thực thi.

Ngay khi chương trình bắt đầu, JavaScript sẽ quét nhanh toàn bộ mã nguồn và dành sẵn không gian bộ nhớ cho tất cả các biến và hàm mà bạn đã khai báo.

  • Với các biến được khai báo bằng var, JavaScript gán cho chúng giá trị undefined.
  • Với các hàm được khai báo bằng từ khóa function, toàn bộ phần thân hàm sẽ được lưu trữ, vì vậy bạn có thể gọi hàm đó trước cả khi nó được viết trong mã nguồn.

Quá trình thiết lập ngầm này được gọi là hoisting.

Ví dụ minh họa

Ví dụ 1: Hoisting với var

console.log(name); var name = "John";

Kết quả:

undefined

JavaScript thực chất hiểu đoạn mã như sau:

var name;
console.log(name); // undefined
name = "John";

Ví dụ 2: Sử dụng biến chưa được khai báo

console.log(age); var name = "John";

Kết quả:

ReferenceError: age is not defined

Tại sao? Vì age chưa từng được khai báo, nên không có vùng nhớ nào được cấp cho nó trong quá trình quét ban đầu.

Ví dụ 3: Hàm khai báo được hoisting hoàn toàn

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

Kết quả:

Hello!

Toàn bộ hàm được hoisting lên đầu.

Ví dụ 4: Arrow function không được hoisting

greet(); // ❌ TypeError: greet is not a function var greet = () => { console.log("Hi there!");
};

Mặc dù greet được khai báo bằng var, nhưng arrow function hoạt động giống như biến, không như một hàm được hoisting

Ghi chú: letconst không giống var

console.log(age); // ❌ ReferenceError let age = 25;

Tại sao vẫn lỗi dù đã khai báo age?

Đó là vì một khái niệm gọi là "Temporal Dead Zone (TDZ)" – vùng chết tạm thời.

“Ừ, tôi biết age tồn tại, nhưng bạn không thể chạm vào nó cho đến khi tôi thực sự đến dòng khai báo.”

Vì vậy, không giống như var, JavaScript không gán giá trị undefined tạm thời cho letconst. Bạn sẽ gặp lỗi ReferenceError nếu cố gắng truy cập chúng quá sớm.

Hy vọng qua bài viết này các bạn đã hiểu rõ được khái niệm Hoisting trong JavaScript là gì.

Bình luận

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

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

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 553

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

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 467

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

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 172

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

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 161

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

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 122

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

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 265