Как работает return в функциях js?

После return ничего же не должно работать, так как мы выходим из функции, но по какой-то причине мы можем объявить функцию и использовать её. Связано ли это как-то со всплытием функций, которые объявлены через Function Declaration? Если да, то разве не должно быть так, что мы сначала объявили функцию, а потом её перезаписали на 10?

let x = 3;
function fn() {
    x = 10;
    return;
    function x() {
    }
}

fn()
console.log(x); // 3


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Сперва, до исполнения, содержимое функции fn компилируется. Компилятор читает тело функции целиком (на этапе компиляции положение return ни на что не влияет) и узнаёт, что внутри объявлен локальный символ x. Локальное объявление скрывает глобальное. Компилятор не оставляет ссылок на глобальный x внутри тела fn.

Когда fn исполняется, то сперва локальный x получает значение функции (это из-за всплытия), затем получает значение 10. Глобальный x не меняется.

Само всплытие функции на результат не влияет. И без всплытия локальные символы скрывают глобальные.

→ Ссылка
Автор решения: u111

Это происходит потому, что function declaration создаются не тогда, когда выполнение доходит до него, а раньше.

console.log(add(5, 5)); // 10, функция add уже объявлена
function add(x, y){
    return x + y;
}

В примере выше происходит по сути то же самое:

let x = 3;
function fn() {
    // Функция x объявляется здесь, x перекрывается и становится глобальной
    x = 10; // Изменилась локальная x, но не глобальная (window.x)
    return;
    function x() {} // Тут ничего не происходит
}

fn()
console.log(x); // 3

С function expression это не работает

console.log(add(5, 5)); // Ошибка, функция add не объявлена
var add = function(x, y){
    return x + y;
}

И

let x = 3;
function fn() {
    x = 10; // На этот раз переменная x не становится локальной и изменяется
    return;
    x = function () {
    }
}

fn()
console.log(x); // 10
→ Ссылка