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ẽ không 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, điều thực tế xảy ra là 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
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ị kết quả đầu ra 5. Chương trình hoạt động như sau:
// 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
chưa xác định
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 đến 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
xin chào Uncaught ReferenceError: b không được định nghĩa
Trong ví dụ trên, biến b được đưa lên đầ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 được 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 vào 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 đó 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: Không thể truy cập 'a' trước khi khởi chạy
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
Xin chào
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 mới được lưu vào. Ví dụ;
// program to print the text greet(); let greet = function() ( console.log('Hi, there.'); )
Đầu ra
Uncaught ReferenceError: welcome không được định nghĩa
Nếu var
được sử dụng trong chương trình trên, lỗi sẽ là:
Uncaught TypeError: welcome không phải là một hàm
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 là bạn nên khai báo biến và hàm trước khi sử dụng chú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
.