Javascript, почему можно указать обратный вызов без параметров? - PullRequest
0 голосов
/ 23 октября 2018

Я изначально пришел из языка программирования 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);
});

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

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

  • почему в 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 зарегистрированную функцию, которая регистрируется на консоли.Помните, что обратные вызовы асинхронны.

Функции имеют неявные возвраты, если не указано, что возвращает undefined, что означает, что вы не возвращали явно.

Ниже приведен пример:

function hello() {
  console.log('Hello, World');
}

console.log(hello()); // undefined.

function hi() {
  return 'Hi, World';
}

console.log(hi()); // Hi, World.
0 голосов
  1. В JavaScript функция является объектом.Он ведет себя как функция только с (), поэтому вы можете передать функцию другой функции или переменной в качестве значения.

  2. Некоторые функции в javascript являются асинхронными.setTimeout - это такая асинхронная функция.Это означает, что функция обратного вызова будет запущена через некоторое время.

Что происходит:

//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);
});
0 голосов
/ 23 октября 2018

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

И также он не возвращает объект пользователя, он просто утешает пользователяобъект.Так как вы не использовали возврат, он вернет undefined.Попробуйте утешить обратный вызов fn return out.

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

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

};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...