Я застрял с концепцией «Функции, возвращающие функции». Я имею в виду книгу Стояна Стефанова «Объектно-ориентированный Javascript».
Фрагмент первый:
function a() {
alert('A!');
function b(){
alert('B!');
}
return b();
}
var s = a();
alert('break');
s();
Вывод:
A!
B!
break
Фрагмент два
function a() {
alert('A!');
function b(){
alert('B!');
}
return b;
}
var s = a();
alert('break');
s();
A!
break
B!
Может ли кто-нибудь сказать мне разницу между возвратом b
и b()
приведенными выше фрагментами?
javascript
Кафекоридор
источник
источник
Ответы:
Присвоение переменной функции (без скобок) копирует ссылку на функцию. Помещение круглой скобки в конце имени функции вызывает функцию, возвращая возвращаемое функцией значение.
Демо
В вашем примере вы также определяете функции внутри функции. Такие как:
Функция по-прежнему вызывается. Он все еще существует. Это постоянно используется в JavaScript. Функции можно передавать так же, как и другие значения. Учтите следующее:
Счетчик функций может сохранять переменные, которые были определены вне его. Это называется закрытием. Он также часто используется в JavaScript.
источник
this
означает только что-то внутри тела функции, иначе это глобально. Вы говорите оthis.sayName
том, что вам нужна глобальная переменная,sayName
которой не существует, она не определена и поэтому не вызывается.Возврат имени функции без
()
возвращает ссылку на функцию, которую можно присвоить так же, как вы сделали сvar s = a()
.s
now содержит ссылку на функциюb()
, и вызовs()
функционально эквивалентен вызовуb()
.Вызов функции с помощью
()
в операторе return выполняет функцию и возвращает любое значение, возвращенное функцией. Это похоже на вызовvar x = b();
, но вместо того, чтобы присваивать возвращаемое значение,b()
вы возвращаете его из вызывающей функцииa()
. Если сама функцияb()
не возвращает значение, вызов возвращаетсяundefined
после выполнения любой другой работыb()
.источник
return b();
вызывает функцию b () и возвращает ее результат.return b;
возвращает ссылку на функцию b, которую вы можете сохранить в переменной для последующего вызова.источник
Возвращение
b
- это возврат объекта функции. В Javascript функции - это просто объекты, как и любой другой объект. Если вы сочтете это бесполезным, просто замените слово «объект» на «вещь». Вы можете вернуть любой объект из функции. Вы можете вернуть значение истина / ложь. Целое число (1,2,3,4 ...). Вы можете вернуть строку. Вы можете вернуть сложный объект с несколькими свойствами. И вы можете вернуть функцию. функция - это просто вещь.В вашем случае возврат
b
возвращает вещь, это вызываемая функция. Возвратb()
возвращает значение, возвращаемое вызываемой функцией.Рассмотрим этот код:
Используя приведенное выше определение,
return b();
возвращает значение 42. С другой стороны,return b;
возвращает функцию, которая сама возвращает значение 42. Это две разные вещи.источник
42
;)Когда вы вернетесь
b
, это просто ссылка на функцию b, но в настоящее время она не выполняется.Когда вы возвращаетесь
b()
, вы выполняете функцию и возвращаете ее значение.Попробуйте
alert
INGtypeof(s)
в ваших примерах. Фрагмент b даст вам «функцию». Что даст вам сниппет?источник
s
. Попробуйтеreturn this
вместо того, чтобыreturn b
…s.b()
Тогда вы сможете сделать это ;)Представьте себе функцию как тип, например int. Вы можете вернуть целые числа в функции. Вы тоже можете возвращать функции, они являются объектом типа «функция».
Теперь проблема синтаксиса: поскольку функции возвращают значения, как вы можете вернуть функцию, а не ее значение?
опуская скобки! Потому что без скобок функция не будет выполняться! Так:
Вернет «функцию» (представьте, что вы возвращаете число), а:
Сначала выполняет функцию, а затем возвращает значение, полученное при ее выполнении, это большая разница!
источник
Создайте переменную :
Объявить функцию :
Предупредить значение из
thing1
(нашего первых переменного):Теперь, если бы мы хотели
thing1
быть ссылкой на функциюsomething1
, то есть это было бы то же самое, что и наша созданная функция, мы бы сделали:Однако, если нам нужно
return
значение функции, мы должны присвоить ему значение, возвращаемое выполненной функцией. Вы выполняете функцию, используя круглые скобки:источник
Первый фрагмент:
оператор 'b ()' означает выполнение функции с именем 'b', которая отображает диалоговое окно с текстом 'B!'
оператор return b (); означает выполнить функцию с именем 'b' и затем вернуть то, что возвращает функция 'b'. но 'b' ничего не возвращает, тогда и этот оператор 'return b ()' ничего не возвращает. Если b () возвращает число, то return b () также является числом.
Теперь 's' присваивается значение того, что возвращает 'a ()', которое возвращает 'b ()', что является ничем, поэтому 's' - это ничто (в JavaScript это действительно вещь, это 'undefined'. Итак, когда вы просите JavaScript интерпретировать, какой тип данных представляет собой 's', интерпретатор JavaScript сообщит вам, что 's' является неопределенным.) Поскольку 's' является неопределенным, когда вы запрашиваете JavaScript для выполнения этого оператора 's ()', вы просите JavaScript выполнить функцию с именем 's', но 's' здесь означает 'undefined', а не функцию, поэтому JavaScript будет жаловаться: "эй, s не функция, я не знаю, как чтобы сделать с этим s ", то сообщение об ошибке" Uncaught TypeError: s is not a function "будет отображаться с помощью JavaScript (проверено в Firefox и Chrome)
Фрагмент два
теперь функция 'a' возвращает указатель / псевдоним функции с именем 'b'. поэтому при выполнении 's = a ()' 's' получит значение, указывающее на b, то есть 's' теперь является псевдонимом 'b', вызов 's' равен вызову 'b'. ie 's' теперь функция. Execute 's ()' означает запуск функции 'b' (то же самое, что выполнение 'b ()'), диалоговое окно, показывающее 'B!' появится (т. е. выполнение оператора 'alert (' B! '); в функции' b ')
источник
Это очень полезно в реальной жизни.
Работа с Express.js
Итак, ваш обычный
express
маршрут выглядит так:Но что, если вам нужно добавить оболочку, обработчик ошибок или что-то еще?
Затем вы вызываете свою функцию из оболочки.
Выглядит сложно? Ну как насчет этого:
Посмотрите, в конце вы передаете функцию,
loggingWrapper
имеющую один аргумент в качестве другой функцииitWorksHandler
, иloggingWrapper
возвращает новую функцию, которая принимает вreq, res, next
качестве аргументов.источник