Вы правы в том, что объявления поднимаются наверх, а назначения - нет.
Однако функции не сохраняют значения каких-либо переменных вне их, когда они создаются.Вместо этого они используют то, что в них, когда их вызывают.В этом случае add
равно undefined
при создании функции multiply
, но ей назначается функция до вызова multiply
, поэтому multiply
использует новую назначенную функцию.
Чтобы увидетьэто более ясно, рассмотрим этот код:
var multiply = function(num) {
return add(num) * 2;
};
// Would be an error
// console.log(multiply(1));
var add = function(num) {
return num + 1;
};
console.log(multiply(1)); // Prints 4
add = function(num) {
return num + 2;
};
console.log(multiply(1)); // Prints 6
Последний console.log
печатает 6
, потому что при умножении использовалась новая функция в add
вместо сохранения той, что была раньше.