Функции, возвращающие функцию - Javascript

Я начал изучать JavaScript в последнее время, и я придерживаюсь этой концепции "Функции, возвращающие функции". Я имею в виду книгу "Объектно-ориентированный Javascript" Стояна Стефанова. У меня есть опыт программирования на Java, C и С++, а также 2 года опыта работы с использованием моих знаний на том же уровне.

Snippet One:

function a() {

    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b();
}

var s = a();
alert('break');
s();

Вывод:

A!
B!
break

Фрагмент 2

function a() {

    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b;
}

var s = a();
alert('break');
s();

Вывод:

A!
break
B!

Может кто-нибудь скажет мне разницу между возвратом b и b() в приведенные выше фрагменты? Я пробовал искать вещи в Google, но не мог получить никаких достойных ссылок. Я был бы рад, если бы кто-то также предоставил мне некоторые ссылки, объясняющие концепцию. Спасибо и с уважением.

Ответ 1

Назначение переменной функции (без скобок) копирует ссылку на функцию. Помещение скобок в конце имени функции вызывает функцию, возвращающую возвращаемое значение функции.

Демо

function a() {
    alert('A');
}
//alerts 'A', returns undefined

function b() {
    alert('B');
    return a;
}
//alerts 'B', returns function a

function c() {
    alert('C');
    return a();
}
//alerts 'C', alerts 'A', returns undefined

alert("Function 'a' returns " + a());
alert("Function 'b' returns " + b());
alert("Function 'c' returns " + c());

В вашем примере вы также определяете функции внутри функции. Например:

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

Функция по-прежнему доступна. Он все еще существует. Это используется в JavaScript все время. Функции можно передавать так же, как и другие значения. Рассмотрим следующее:

function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }
}
var count = counter();
count();
count();
count();

Счетчик функций может содержать переменные, которые были определены вне его. Это называется замыканием. Он также много использовал в JavaScript.

Ответ 2

Возврат имени функции без () возвращает ссылку на функцию, которая может быть назначена так же, как вы сделали с помощью var s = a(). s теперь содержит ссылку на функцию b(), а вызов s() функционально эквивалентен вызову b().

// Return a reference to the function b().
// In your example, the reference is assigned to var s
return b;

Вызов функции с помощью () в операторе return выполняет функцию и возвращает любое значение, возвращаемое функцией. Он похож на вызов var x = b();, но вместо назначения возвращаемого значения b() вы возвращаете его из вызывающей функции a(). Если функция b() сама не возвращает значение, вызов возвращает undefined после выполнения любой другой работы с помощью b().

// Execute function b() and return its value
return b();
// If b() has no return value, this is equivalent to calling b(), followed by
// return undefined;

Ответ 3

return b(); вызывает функцию b() и возвращает ее результат.

return b; возвращает ссылку на функцию b, которую вы можете сохранить в переменной для вызова позже.

Ответ 4

Возврат b возвращает объект функции. В Javascript функции - это просто объекты, как и любой другой объект. Если вы обнаружите, что это не полезно, просто замените слово "объект" на "вещь". Вы можете вернуть любой объект из функции. Вы можете вернуть значение true/false. Целое число (1,2,3,4...). Вы можете вернуть строку. Вы можете вернуть сложный объект с несколькими свойствами. И вы можете вернуть функцию. функция - это просто вещь.

В вашем случае возврат b возвращает вещь, вещь является вызываемой функцией. Возврат b() возвращает значение, возвращаемое вызываемой функцией.

Рассмотрим этот код:

function b() {
   return 42;
}

Используя приведенное выше определение, return b(); возвращает значение 42. С другой стороны, return b; возвращает функцию, которая сама возвращает значение 42. Это две разные вещи.

Ответ 5

Когда вы возвращаете b, это просто ссылка на функцию b, но не выполняется в это время.

Когда вы возвращаете b(), вы выполняете функцию и возвращаете ее значение.

Попробуйте alert ing typeof(s) в ваших примерах. Фрагмент b даст вам функцию. Что даст вам отрывок?

Ответ 6

Представьте себе функцию как тип, например, int. Вы можете вернуть ints в функцию. Вы также можете возвращать функции, они являются объектом типа "функция".

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

опуская скобки! Потому что без скобок функция не будет выполнена! Итак:

return b;

Вернет "функцию" (представьте, что, если вы возвращаете число), а:

return b();

Сначала выполняется функция , затем возвращает значение, полученное путем его выполнения, это большая разница!

Ответ 7

Создайте переменную :

var thing1 = undefined;

Объявить Функция:

function something1 () {
    return "Hi there, I'm number 1!";
}

Оповести значение thing1 (наша первая переменная):

alert(thing1); // Outputs: "undefined".

Теперь, если бы мы хотели, чтобы thing1 была ссылкой для функции something1, что означает, что это будет то же самое, что и наша созданная функция, мы бы сделали:

thing1 = something1;

Однако, если нам нужно значение return , тогда мы должны назначить ему возвращаемое значение выполняемой функции. Вы выполняете функцию с помощью скобок:

thing1 = something1(); // Value of thing1: "Hi there, I'm number 1!"