Подъем JavaScript: функция может ссылаться на другую функцию, объявленную ниже? - PullRequest
1 голос
/ 09 марта 2019

у меня есть:

// Shouldn't we have the following hoisted?
// var multiply; (undefined)
// var add; (undefined)

var multiply = function(num) {
  return add(num) * 2;
};

var add = function(num) {
  return num + 1;
};

console.log(multiply(1)); // No error, somehow "multiply" calls "add"!

Я думал, что переменные JavaScript поднимаются наверх, а не значения, которым они назначены. Каким-то образом multiply вызов add не возвращает ошибку, даже если add объявлено ниже multiply.

1 Ответ

1 голос
/ 09 марта 2019

Вы правы в том, что объявления поднимаются наверх, а назначения - нет.

Однако функции не сохраняют значения каких-либо переменных вне их, когда они создаются.Вместо этого они используют то, что в них, когда их вызывают.В этом случае 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 вместо сохранения той, что была раньше.

...