Javascript, почему можно указать обратный вызов без параметров?

1

Я изначально исходил из языка программирования 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);
});
  • 0
    «поскольку я не указал функцию возврата внутри функции обратного вызова (пользователь) или вообще не указал тело функции для моего обратного вызова» - Вы имеете ... (userObject) => {console.log(userObject);}); (что аналогично function(userObject) { return console.log(userObject); } )
  • 0
    Это не тоже самое. Он не возвращает console.log (userObject). Скорее, он возвращается неопределенным.
Показать ещё 1 комментарий
Теги:
callback
handler

3 ответа

1
Лучший ответ

Здесь я вижу два вопроса:

  • почему в javascript можно передать функцию обратного вызова как переменную или простой объект (без параметров) в другую функцию.

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

Подробнее здесь: 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.
  • 0
    хорошо, спасибо, я думаю, что я не понял, что я определил свою функцию обратного вызова внутри getUser (id, (параметр) => {}) ... как анонимную функцию с одним параметром, который был мне неизвестен как Java-разработчик;) так что это скорее вопрос определения функции JavaScript, я думаю ...
0

Функция, т.е. обратный вызов, передается здесь как ссылка. Таким образом, вы можете передавать его столько, сколько хотите, когда вы его вызываете, тогда вы можете передать аргументы и ссылаться на оригинальную функцию.

А также он не возвращает пользовательский объект, он просто утешает пользовательский объект. Поскольку вы не использовали никакого возврата, он будет возвращен не определен. Попробуйте утешить обратный вызов fn.

var getUser = (id,callback) => {
var user = {
    id: id,
    name: 'Vikram'
};

setTimeout(() => {
    console.log(callback(user), 'return value of callback');
},3000);    

};

  • 0
    ОК, обратный вызов передается здесь как ссылка, но как я могу передать параметр в обратный вызов (параметр), если я не определил свой обратный вызов с какими-либо параметрами, а затем просто использую эту функцию где-то ниже: function (userObject) {console. log (userObject)}, который по существу «сопоставляется» с моей ссылкой на функцию обратного вызова ... или, если я понял прямо здесь, я определил свою функцию обратного вызова (параметр) точно в последней функции getUser () как анонимную функцию, если я правильно? и он вызывается сверху как ссылка на функцию обратного вызова? (так что по существу он все еще имеет параметр def ниже)
  • 0
    Да, вы правы, вы передаете определение функции при вызове getUser. Поскольку функции также рассматриваются как объекты в JS, они передаются как ссылка на getUser. Таким образом, вы можете передать этот «обратный вызов» любой функции в getUser, и он все равно будет содержать ссылку на то, что вы передаете во время вызова getUser. Я надеюсь это имеет смысл!
Показать ещё 1 комментарий
0
  1. В javascript функция - это объект. Он ведет себя как функция только с () Таким образом, вы можете передать функцию другой функции или переменной в качестве значения.

  2. Некоторые функции в 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);
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню