Функции, возвращающие функцию - 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!"