Я изначально пришел с языка программирования Java, и мне просто было интересно, почему в javascript можно передать функцию обратного вызова как переменную или простой объект (без параметров) в другую функцию, а затем использовать эту функцию обратного вызова внутри другой функции, но на этот раз с параметрами для передачи.
И как именно этот обратный вызов возвращает мой пользовательский объект, поскольку я не указывал функцию возврата внутри callback(user) или вообще не указывал какое-либо тело функции для моего обратного вызова. Это делается внутри функции setTimeout(()...), поскольку реализация timeoutHandler что-то неявно возвращает?
var getUser = (id,callback) => {
var user = {
id: id,
name: 'Vikram'
};
setTimeout(() => {
callback(user);
},3000);
};
getUser(31, (userObject) => {
console.info(userObject);
});
Это не одно и то же. Он не возвращает console.info (userObject). Скорее он возвращается undefined.
@ Diljohn5741 на самом деле console.info всегда возвращает undefined, поэтому, пока он находится в последней строке вашей функции, не имеет значения, вернете вы его или нет



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Здесь в качестве ссылки передается функция, т.е. обратный вызов. Таким образом, вы можете передавать его столько, сколько хотите, когда вы его вызываете, вы можете передать аргументы, и он будет ссылаться на исходную функцию.
И также он не возвращает пользовательский объект, он просто утешает пользовательский объект. Поскольку вы не использовали возврат, он вернет undefined. Попробуйте утешить обратный вызов fn return out.
var getUser = (id,callback) => {
var user = {
id: id,
name: 'Vikram'
};
setTimeout(() => {
console.info(callback(user), 'return value of callback');
},3000);
};
хорошо, обратный вызов здесь передается как ссылка, но как я могу передать параметр обратному вызову (параметр), если я не определил свой обратный вызов с какими-либо параметрами, а затем просто используйте эту функцию где-нибудь ниже: function (userObject) {console. log (userObject)}, который по существу "сопоставляется" с моей ссылкой на функцию обратного вызова ... или, если я правильно понимаю, я определил свою функцию обратного вызова (параметр) точно в последней функции getUser () как анонимную функцию, если я Правильно? и он вызывается сверху как ссылка на объект функции "обратного вызова"? (так что, по сути, он по-прежнему имеет параметр def ниже)
Да, вы правы, вы передаете определение функции при вызове getUser. Поскольку функции также рассматриваются как объекты в JS, они передаются как ссылка в getUser. Таким образом, вы можете передать этот «обратный вызов» любой функции внутри getUser, и он по-прежнему будет содержать ссылку на то, что вы передаете при вызове getUser. Я надеюсь это имеет смысл!
хорошо, спасибо, я просто нахожу это действительно запутанным, иногда я думаю, что эта функция выполняется в том же месте, где я ее определил, но это, конечно, неправильно, она просто передается и выполняется на сайте обратного вызова ...
Я вижу здесь два вопроса:
Поскольку функции являются объектами первого класса, мы можем передать функцию в качестве аргумента в другую функцию, а затем выполнить эту переданную функцию или даже вернуть ее для выполнения позже.
Подробнее здесь: https://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/
Ниже показано, что функции также являются просто объектами:
function hello() {
return 'hello';
}
hello.other = 'world';
console.info(hello() + ', ' + hello.other);
callback(user) или вообще не указывал какое-либо тело функции для моего обратного вызова.Функция setTimeout(()...) неявно ничего не возвращает, она просто регистрирует функцию, которая будет выполняться позже. Когда функция, зарегистрированная триггером setTimeout, запускается, она вызывает callback(user), и это разрешает зарегистрированную функцию getUser, которая регистрируется в консоли. Помните, что обратные вызовы асинхронны.
Функции имеют неявный возврат, если не указан, который возвращает undefined, что означает, что вы не вернули явно.
Ниже показан пример:
function hello() {
console.info('Hello, World');
}
console.info(hello()); // undefined.
function hi() {
return 'Hi, World';
}
console.info(hi()); // Hi, World.
хорошо, спасибо, я думаю, что я не понял, что я определил свою функцию обратного вызова внутри getUser (id, (параметр) => {}) ... как анонимную функцию с одним параметром, который был мне неизвестен как Разработчик Java;) так что это был скорее вопрос определения функции javascript, я думаю ...
В javascript функция - это объект.
Работает как функция только с ()
Таким образом, вы можете передать функцию другой функции или переменной как значение.
Некоторые функции в javascript асинхронны. setTimeout - это такая функция async. Это означает, что функция обратного вызова будет запущена через некоторое время.
Что творится:
//assign anonymous function to variable
// until function without () it only a object
var getUser = (id,callback) => {
//set up params
var user = {
id: id,
name: 'Vikram'
};
// setup asynchronous function setTimeout
setTimeout(() => {
// run callback with params when time would done
callback(user);
},3000);
};
// call function which contains in getUser-variable and pass 2 params: int and callback-function
getUser(31, (userObject) => {
console.info(userObject);
});
(userObject) => {console.info(userObject);});(он жеfunction(userObject) { return console.info(userObject); })