JavaScript Hoisting

Trong hướng dẫn này, bạn sẽ tìm hiểu về JavaScript lưu trữ với sự trợ giúp của các ví dụ.

Hoisting trong JavaScript là một hành vi trong đó một hàm hoặc một biến có thể được sử dụng trước khi khai báo. Ví dụ,

// using test before declaring
console.log(test);   // undefined
var test;

Chương trình trên hoạt động và đầu ra sẽ là chưa xác định. Chương trình trên hoạt động như

// using test before declaring
var test;
console.log(test); // undefined

Vì kiểm tra biến chỉ được khai báo và không có giá trị, nên undefinedgiá trị được gán cho nó.

Nếu bạn muốn tìm hiểu thêm về các biến, hãy truy cập Biến JavaScript .

Lưu ý : Trong hoisting, mặc dù có vẻ như khai báo đã được chuyển lên trong chương trình, nhưng điều thực tế xảy ra là các khai báo hàm và biến được thêm vào bộ nhớ trong giai đoạn biên dịch.

Tời nâng có thể thay đổi

Trong điều kiện của các biến và hằng số, từ khóa varđược kéo lên và letvà constkhông cho phép cẩu.

Ví dụ,

// program to display value
a = 5;
console.log(a);
var a; // 5

Trong ví dụ trên, biến a được sử dụng trước khi khai báo nó. Và chương trình hoạt động và hiển thị đầu ra5. Chương trình hoạt động như:

// program to display value
var a;
a = 5;
console.log(a); // 5

Tuy nhiên trong JavaScript, các khởi tạo không được lưu trữ. Ví dụ,

// program to display value
console.log(a);
var a = 5;

Đầu ra

undefined

Chương trình trên hoạt động như sau:

var a;
console.log(a);
a = 5;

Chỉ phần khai báo được chuyển vào bộ nhớ trong giai đoạn biên dịch. Do đó, giá trị của biến a là undefineddo a được in ra mà không cần khởi tạo nó.

Ngoài ra, khi biến được sử dụng bên trong hàm, biến chỉ được nâng lên đầu của hàm. Ví dụ,

// program to display value
var a = 4;

function greet() {
    b = 'hello';
    console.log(b); // hello
    var b;
}

greet(); // hello
console.log(b);

Đầu ra

hello
Uncaught ReferenceError: b is not defined

Trong ví dụ trên, biến b được đưa vào đầu của hàm greetvà trở thành một biến cục bộ. Do đó b chỉ có thể truy cập bên trong hàm. b không trở thành một biến toàn cục.

Để tìm hiểu thêm về các biến cục bộ và toàn cục, hãy truy cập Phạm vi biến JavaScript .

Lưu ý : Trong hoists, khai báo biến chỉ có thể truy cập được đối với phạm vi tức thời.

Nếu một biến được sử dụng với lettừ khóa, thì biến đó sẽ không được lưu vào. Ví dụ,

// program to display value
a = 5;
console.log(a);
let a; // error

Đầu ra

Uncaught ReferenceError: Cannot access 'a' before initialization

Trong khi sử dụng let, biến phải được khai báo trước.

Chức năng nâng

Một hàm có thể được gọi trước khi khai báo nó. Ví dụ,

// program to print the text
greet();

function greet() {
    console.log('Hi, there.');
}

Đầu ra

Hi, there

Trong chương trình trên, hàm greetđược gọi trước khi khai báo và chương trình hiển thị kết quả đầu ra. Điều này là do cẩu.

Tuy nhiên, khi một hàm được sử dụng như một biểu thức , một lỗi sẽ xảy ra vì chỉ có các khai báo được lưu vào. Ví dụ;

// program to print the text
greet();

let greet = function() {
    console.log('Hi, there.');
}

Đầu ra

Uncaught ReferenceError: greet is not defined

Nếu varđược sử dụng trong chương trình trên, lỗi sẽ là:

Uncaught TypeError: greet is not a function

Lưu ý : Nói chung, quá trình lưu trữ không được thực hiện trong các ngôn ngữ lập trình khác như Python, C, C ++, Java.

Việc treo có thể gây ra kết quả không mong muốn trong chương trình của bạn. Và tốt nhất bạn nên khai báo các biến và hàm trước khi sử dụng và tránh trường hợp bị treo.

Trong trường hợp của các biến, nó là tốt hơn để sử dụng lethơn var.









Gõ tìm kiếm nhanh...