Переменная JavaScript до и после объявления?

function a(){ 
   console.info(typeof b); // function
   function b() {
     var c = 52; 
     console.info(c);
   } 
   var b = 88;  
   console.info(typeof b); // number 
}

Может ли кто-нибудь ответить, как javaScript компилирует или обрабатывает этот конкретный случай? Я знаю, что JavaScript отдает предпочтение объявлению function, когда дело доходит до hoisting. Но как одно и то же identifierb может содержать два разных значения в одном блоке или в одной лексической области видимости?

Кто-то может сказать: «Хорошо, я буду использовать b как function перед его объявлением и как number после присвоения ему number».

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
250
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете понять, что есть две фазы выполнения кода.

  1. Creation phase
  2. Execution phase

Этап создания: - Во время фазы создания функция поднимается вверх как есть, в то время как переменная поднимается, но ей не присвоено значение (или вы можете сказать, что ее значение не определено)

Фаза выполнения: - В контексте выполнения он присваивает значение переменной, когда она достигает строки, где происходит присвоение

поэтому в вашем коде во время creation phase функция b поднимается, компилятор будет читать это так

function a(){ 
   function b(){
     var c = 52; 
     console.info(c);
   } 
   console.info(typeof b); // function
   b = 88;  
   console.info(typeof b); // number 
}

поэтому, когда вы дойдете до линии

b = 88

он присваивает новое значение переменной b типа number

Насколько я знаю, это не две разные ссылки.

Внутри, function b(){/*Code Here*/} выполняется как var b = function(){/*Code Here*/} Следовательно, первый typeof(b) возвращает функция.

И когда var b = 88; выполняется, это в основном присваивает 88 уже существующей ссылке б. Следовательно, второй typeof(b) возвращает количество.

Изображение времени выполнения для справки:

В этом случае подъем происходит следующим образом:

  1. объявить var b, без инициализации
  2. объявить function b, что переопределяет объявление var
  3. присвоить значение 88 переменной b

Таким образом, функция фактически преобразуется в «логический эквивалент»:

function a(){ 
   var b; // hoisted
   b = function b(){ // hoisted
     var c = 52; 
     console.info(c);
   } 
   console.info(typeof b); // function
   b = 88;  
   console.info(typeof b); // number 
}

Примечание: Поднимаются только объявления, а не инициализации

Другие вопросы по теме