Я изначально исходил из языка программирования Java, и мне просто интересно, почему в javascript можно передать функцию обратного вызова как переменную или простой объект (без параметров) в другую функцию, а затем использовать эту функцию обратного вызова внутри другой функции, но на этот раз с параметрами.
И как именно этот обратный вызов возвращает мой пользовательский объект, поскольку я не указывал функцию возврата внутри callback(user)
или вообще не определял какой-либо элемент функции для моего обратного вызова. Это делается внутри функции setTimeout(()...)
поскольку реализация timeoutHandler
неявно возвращает что-то?
var getUser = (id,callback) => {
var user = {
id: id,
name: 'Vikram'
};
setTimeout(() => {
callback(user);
},3000);
};
getUser(31, (userObject) => {
console.log(userObject);
});
Здесь я вижу два вопроса:
Поскольку функции являются первоклассными объектами, мы можем передать функцию в качестве аргумента в другой функции, а затем выполнить эту переданную функцию или даже вернуть ее для последующего выполнения.
Подробнее здесь: https://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/
Ниже показаны функции как объекты:
function hello() {
return 'hello';
}
hello.other = 'world';
console.log(hello() + ', ' + hello.other);
callback(user)
или вообще не указывал какой-либо элемент функции для моего обратного вызова. Функция setTimeout(()...)
не неявно возвращает что-либо, она просто регистрирует функцию, которая будет выполняться позже. Когда функция, зарегистрированная триггерами setTimeout, вызывает callback(user)
и которая разрешает getUser
регистрации getUser
которая регистрируется на консоли. Помните, что обратные вызовы асинхронны.
Функции имеют неявные возвращения, если они не указаны, что возвращает undefined
, то есть вы явно не возвращали.
Ниже приведен пример:
function hello() {
console.log('Hello, World');
}
console.log(hello()); // undefined.
function hi() {
return 'Hi, World';
}
console.log(hi()); // Hi, World.
Функция, т.е. обратный вызов, передается здесь как ссылка. Таким образом, вы можете передавать его столько, сколько хотите, когда вы его вызываете, тогда вы можете передать аргументы и ссылаться на оригинальную функцию.
А также он не возвращает пользовательский объект, он просто утешает пользовательский объект. Поскольку вы не использовали никакого возврата, он будет возвращен не определен. Попробуйте утешить обратный вызов fn.
var getUser = (id,callback) => {
var user = {
id: id,
name: 'Vikram'
};
setTimeout(() => {
console.log(callback(user), 'return value of callback');
},3000);
};
В 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.log(userObject);
});
(userObject) => {console.log(userObject);});
(что аналогичноfunction(userObject) { return console.log(userObject); }
)