Как объяснить следующие примеры? Подъемно? - PullRequest
3 голосов
/ 30 сентября 2019

Я пытался объяснить проблему с подъемом javascript, но я не смог объяснить случай b.

Не b = 50 не изменил глобальную переменную b?

Это причина для областей уровня блока?

Среда

Chrome 77

{
  a = 50
  function a() {}
}
console.log(a) //  50
console.log(b) // undefined
{
  console.log(b) // f b () {}
  function b() {}
  b = 50
  console.log(b) // 50
}
console.log(b) // ƒ b () {}

Я думал, b было 50, как a. но это была функция.

1 Ответ

1 голос
/ 30 сентября 2019

2 важных события происходят здесь

  1. Хостинг происходит в функции - размещение чего-либо внутри {}, рассматриваемого как блок, а не функция.
  2. Объявления функций поднимаются над переменной- следовательно, если var и function имеют одно и то же имя, функция получит предпочтение

console.log(x); // f() {} //hoisted with assignment since "x" is function
var x = 90;
function x() {}

console.log(a); // undefined // hoisting of child block-scope variable is never assigned not even if "a" is function
{
    console.log(a); // f(){}
    a = 50; //**while execution //since global scope "a" not assigned yet it takes the first assignment in this child-block
    console.log(a); // 50 // because value has been assigned to "a" already
    function a(){} // Ignored //function "a" was never hoisted over variable assignment
    console.log(a); // 50 // block scope has "a=50" attached to it
}
console.log(a); // 50 // global scope also has "a=50" attached to it


console.log(b) // undefined // hoisting of child block-scope variable is never assigned not even if "a" is function
{
  console.log(b) // f () {}
  function b() {} // While hoisting global scope and this block scope get "b" attached to their scope as a function
  b = 50 // var b is reassigned, but "b" attached to this block is only reassigned, since type is changed globally attached "b" is not reached
  console.log(b) // 50
}
console.log(b) // ƒ () {} // globally attached "b" is a function
...