Если переменная JavaScript вызывается как функция, то каков рабочий процесс?
let a=5;
function show(){
a=10;
function a(){};
return a;
}
let res=show();
console.info(a,res); //output:5 10
Может ли кто-нибудь объяснить, почему вместо a отображается 5, в чем смысл функции a(){}?
@CarstenMassmann Нет, все наоборот. Определение функцииa()
поднимается вверху функции show()
как локальная переменная, а затем перезаписывается числом 10
. Затем функция show()
возвращает локальную переменную a
. (Если бы он изменил глобальную переменную a
, то console.info(a, res)
не вывел бы 5 в качестве своего значения.)
Определение функции a()
приводит к созданию локального экземпляра a
в show()
. Это (создание функций) всегда происходит до выполнения любого другого кода в этой функции. После этого a
получает новое значение: 10, и оно в конечном итоге возвращается в конце функции. Да, @GuyIncognito, я только что прочитал твой комментарий и согласен: «поднимать» здесь волшебное слово! ;-)
В JavaScript все объявления функций поднимаются в верхнюю часть области видимости. Объявления функций сами по себе создают область, поэтому в этом случае код действительно интерпретируется как:
let a=5;
function show(){
function a(){};
a=10;
return a;
}
let res=show();
Это означает, что внешняя ссылка a
никогда не меняется.
Связанный с этим вопрос SO: область видимости функций в JavaScript
Ваша функция
show()
присваивает значение 10 глобальной переменнойa
и определяет функциюa()
в своей области видимости. Похоже, что в конце функции возвращается глобальная переменнаяa
, а не функцияa()
.