Функция, возвращающая функцию и не имеющая ссылки - PullRequest
3 голосов
/ 30 марта 2019

Мой вопрос об этой функции:

    function d() {
       function e() {
        alert('E');
       }
       return e;
    }
    d()();//alerts 'E'

Когда функция d вызывается в первый раз, функция возвращается e , однако ничто не содержит ссылку на возвращаемое значение (функция e в этом случае), и это возвращаемое значение должно быть потеряно.Итак, как это d () () работает?Это не закрытие, согласно моему пониманию.Спасибо!

Ответы [ 3 ]

4 голосов
/ 30 марта 2019

Вызов d (в последней строке d()) возвращает e, а затем последний () немедленно вызывает эту функцию.

Рассмотрим

function n() { return 5; }

console.log(n() + 1); // 6

Ничто не содержит возвращаемого значения из вызова к n(), и все же возвращаемое значение может использоваться в операции сложения.Возвращаемое значение из вызова d() также может использоваться как ссылка на функцию в выражении вызова функции, что в точности и происходит в вашем коде.

Другими словами, d()возвращает ссылку на функцию (e).Для вызова функции все, что вам нужно, это ссылка на функцию, взятую из где-то , и список аргументов в скобках.Вот что d()() дает вам.

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

Вам не нужна именованная ссылка на функцию, чтобы использовать ее.Вы можете применить оператор к результату любого выражения на месте, а вызов функции () - это просто другой оператор.

Таким образом, он мало отличается от выполнения сложения в результате вызова функции.

function returnTwo() {
  return 2;
}

console.log(returnTwo() + 40);

Здесь мы не храним результат returnTwo(), но мы все равно можем использовать его в качестве левого операнда оператора +.Так что с вызовом функции в вашем примере вы делаете то же самое.

0 голосов
/ 30 марта 2019
function d() {
   function e() {
    alert('E');
   }
   return e;
}
d()();
//alerts 'E'

Ссылка не требуется, поскольку она явно преобразуется в возвращаемое значение.Если не сохранено, результат выражения JavaScript (последовательность интерпретируемых переменных, функций и / или операций, возвращающих значение) будет полностью оценен и затем удален из памяти.Ключ в том, что оно должно быть fully evaluated.Вы можете почти представить себе функциональное исполнение как горизонтальные русские матрешки.Выражение JavaScript выглядит так:

d()();

Таким образом, оно начинается слева направо:

d()

, которое выполняется и возвращает:

function e() { ... }

, которое поворачиваетсястрока в:

function e() { ... }()

, которая затем выполняется, предупреждает и возвращает:

//nothing

Полное выражение завершено.Для этого ничего не осталось.Ссылка нигде не сохраняется, и сразу после разрешения этого выражения все, что было возвращено из его оценок, выбрасывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...