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
. Но как одно и то же identifier
b
может содержать два разных значения в одном блоке или в одной лексической области видимости?
Кто-то может сказать: «Хорошо, я буду использовать b
как function
перед его объявлением и как number
после присвоения ему number
».
Вы можете понять, что есть две фазы выполнения кода.
Creation phase
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)
возвращает количество.
В этом случае подъем происходит следующим образом:
var b
, без инициализацииfunction b
, что переопределяет объявление var88
переменной 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
}
Примечание: Поднимаются только объявления, а не инициализации
Возможный дубликат Порядок подъема в JavaScript и javascript подъем для глобальной переменной и функции и Приоритет объявлений функций/перезапись объявлений переменных? Подъем? Почему?