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 undefined
giá 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à let
và const
khô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à undefined
do 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 greet
và 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 let
từ 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 let
hơn var
.