Para descrever a hospedagem em javascript em uma frase, as variáveis e funções são colocadas no topo do escopo em que são declaradas.
Presumo que você seja um iniciante, para entender o içamento de maneira adequada, primeiro entendemos a diferença entre undefined e ReferenceError
var v;
console.log(v);
console.log(abc);
/*
The output of the above codes are:
undefined
ReferenceError: abc is not defined*/
agora no código abaixo o que vemos? uma variável e uma expressão de função são excluídas.
<script>
var totalAmo = 8;
var getSum = function(a, b){
return a+b;
}
</script>
mas a imagem real com a prova de que a variável e a função são içadas no topo de seu escopo:
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));
Saída dos primeiros dois registros são indefinido e TypeError: getSum não é uma função porque ambos var totalAmo e getSum são içada no topo do seu alcance como abaixo
<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>
Mas para a declaração de funções funções inteiras içadas no topo de seu escopo.
console.log(getId());
function getId(){
return 739373;
}
/* output: 739373, because the whole function hoisted on the top of the scope.*/
Agora, a mesma lógica vale para aqueles varibale, experiências de funções e declaratoins de função declarados dentro do escopo funcional. Ponto principal: não serão içados na parte superior da lima ;
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;
}
}
Portanto, quando você usa var palavra-chave, variável e função içada no topo de seu escopo (escopo global e escopo de função). E quanto a let e const , const e let ainda estão cientes do escopo global e do escopo da função, assim como var, mas as variáveis const e let também estão cientes de outro escopo chamado escopo bloqueado. um escopo de bloco está presente sempre que houver um bloco de código, como for loop, instrução if else, loop while etc.
Quando usamos const e let para declarar uma variável neste escopo de bloco, a declaração da variável somente será içada no topo do bloco em que ela está, e não será içada no topo da função pai ou no topo do âmbito global que é içado.
function getTotal(){
let total=0;
for(var i = 0; i<10; i++){
let valueToAdd = i;
var multiplier = 2;
total += valueToAdd*multiplier;
}
return total;
}
Variáveis no exemplo abobe serão içadas como abaixo
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;
}