Hosts trong JavaScript là gì?

Giải thích ngắn gọn về ý nghĩa của hoisting trong ngôn ngữ lập trình JavaScript

JavaScript trước khi thực thi mã của bạn sẽ phân tích cú pháp nó và thêm vào bộ nhớ của chính nó mọi khai báo hàm và biến mà nó tìm thấy và lưu giữ chúng trong bộ nhớ. Đây được gọi làcẩu.

Chúng ta có một số hành vi khác nhau cho các khai báo hàm và biểu thức hàm.

Với khai báo hàm, chúng ta có thể gọi một hàm trước khi nó được định nghĩa và mã của chúng ta sẽ hoạt động. Trong các trường hợp khác, chúng tôi sẽ có lỗi.

Một nguyên tắc chung là luôn xác định các hàm, biến, đối tượng và lớp trước khi sử dụng chúng, để tránh bị bất ngờ.

Giả sử chúng ta có một hàm:

function bark() {
  alert('wof!')
}

Do cần cẩu, về mặt kỹ thuật, chúng tôi có thể gọibark()trước khi nó được khai báo:

bark()
function bark() {
  alert('wof!')
}

Với các chức năng, điều này chỉ xảy ra đối vớikhai báo hàm. Giống như trong trường hợp trên.

Không phải với biểu thức hàm.

Đây là một biểu thức hàm:

bark()
var bark = function() {
  alert('wof!')
}

Trong trường hợp này,varkhai báo được lưu trữ và khởi tạo vớiundefinednhư một giá trị, một cái gì đó như thế này:

var bark = undefined
bark()
bark = function() {
  alert('wof!')
}

Chạy mã này sẽ cung cấp cho bạnTypeError: bark is not a functionlỗi.

constletkhai báo cũng được lưu trữ, nhưng chúng không được khởi tạo thành không xác định nhưvar.

const bark = function() {
  alert('wof!')
}

hoặc là

let bark = function bark() {
  alert('wof!')
}

Trong trường hợp này, nếu bạn gọibark()trước khi khai báo nó, nó sẽ cung cấp cho bạn mộtReferenceError: Cannot access 'bark' before initializationlỗi.

Điều tương tự cũng sẽ xảy ra đối với bất kỳ biểu thức nào khác gán một đối tượng hoặc lớp cho một biến

Khai báo lớp hoạt động giống nhưletconstkhai báo: chúng được lưu trữ, nhưng không được khởi tạo và sử dụng một lớp trước khai báo của nó sẽ cung cấpReferenceError: <Class> is not definedlỗi.

Tải xuống miễn phí của tôiSổ tay dành cho Người mới bắt đầu JavaScript


Các hướng dẫn js khác: