Để mô tả lưu trữ trong javascript trong một câu là các biến và hàm được đưa lên đầu phạm vi mà chúng được khai báo.
Tôi giả sử bạn là người mới bắt đầu, để hiểu đúng về việc nâng cẩu, lúc đầu chúng ta đã hiểu sự khác biệt giữa undefined và ReferenceError
var v;
console.log(v);
console.log(abc);
/*
The output of the above codes are:
undefined
ReferenceError: abc is not defined*/
bây giờ trong đoạn mã dưới đây chúng ta thấy gì? một biến và một biểu thức hàm là decleard.
<script>
var totalAmo = 8;
var getSum = function(a, b){
return a+b;
}
</script>
nhưng hình ảnh thực tế với bằng chứng rằng cả biến và hàm đều được nâng lên trên cùng của phạm vi đó:
console.log(totalAmo);
console.log(getSum(8,9));
var totalAmo = 8;
var getSum = function(a, b){
return a+b;
}
console.log(totalAmo);
console.log(getSum(9,7));
Đầu ra của hai bản ghi đầu tiên không được xác định và TypeError: getSum không phải là một hàm vì cả var totalAmo và getSum đều được lưu trữ trên đầu phạm vi của chúng như dưới đây
<script>
var totalAmo;
var getSum;
console.log(totalAmo);
console.log(getSum(8,9));
var totalAmo = 8;
var getSum = function(a, b){
return a+b;
}
console.log(totalAmo);
console.log(getSum(9,7));
</script>
Nhưng đối với khai báo các hàm, toàn bộ các hàm được nâng lên trên cùng phạm vi của chúng.
console.log(getId());
function getId(){
return 739373;
}
/* output: 739373, because the whole function hoisted on the top of the scope.*/
Bây giờ, cùng một logic đối với các biến thể đó, giải thích hàm và khai báo hàm được khai báo bên trong phạm vi hàm. Điểm chính: chúng sẽ không được đưa lên đầu tệp ;
function functionScope(){
var totalAmo;
var getSum;
console.log(totalAmo);
console.log(getSum(8,9));
var totalAmo = 8;
var getSum = function(a, b){
return a+b;
}
}
Vì vậy, khi bạn sử dụng từ khóa var , biến và hàm được nâng lên trên cùng của phạm vi đó (phạm vi toàn cục và phạm vi hàm). Còn let và const , const và let vẫn nhận thức được phạm vi toàn cục và phạm vi hàm giống như var, nhưng các biến const và let cũng nhận thức được phạm vi khác được gọi là phạm vi bị chặn. phạm vi khối hiện diện bất cứ khi nào có một khối mã, chẳng hạn như vòng lặp for, câu lệnh if else, vòng lặp while, v.v.
Khi chúng ta sử dụng const và let để khai báo một biến trong phạm vi khối này, chỉ khai báo biến sẽ được lưu trên đầu của khối mà nó nằm trong đó và nó sẽ không được lưu trên đầu của hàm mẹ hoặc đầu của phạm vi toàn cầu mà nó được nâng lên.
function getTotal(){
let total=0;
for(var i = 0; i<10; i++){
let valueToAdd = i;
var multiplier = 2;
total += valueToAdd*multiplier;
}
return total;
}
Các biến trong ví dụ trên tàu sẽ được liệt kê như sau
function getTotal(){
let total;
var multiplier;
total = 0;
for(var i = 0; i<10; i++){
let valueToAdd;
valueToAdd = i;
multiplier = 2;
total += valueToAdd*multiplier;
}
return total;
}