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

Я изначально пришел с языка программирования 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);
});
«поскольку я не указывал функцию возврата внутри обратного вызова (пользователя) или вообще не указывал тело функции для моего обратного вызова» - У вас есть ... (userObject) => {console.info(userObject);}); (он же function(userObject) { return console.info(userObject); })
Andreas 23.10.2018 13:36

Это не одно и то же. Он не возвращает console.info (userObject). Скорее он возвращается undefined.

Diljohn5741 23.10.2018 13:42

@ Diljohn5741 на самом деле console.info всегда возвращает undefined, поэтому, пока он находится в последней строке вашей функции, не имеет значения, вернете вы его или нет

barbsan 23.10.2018 13:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
185
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

И также он не возвращает пользовательский объект, он просто утешает пользовательский объект. Поскольку вы не использовали возврат, он вернет 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 ниже)

ChillaBee 24.10.2018 18:02

Да, вы правы, вы передаете определение функции при вызове getUser. Поскольку функции также рассматриваются как объекты в JS, они передаются как ссылка в getUser. Таким образом, вы можете передать этот «обратный вызов» любой функции внутри getUser, и он по-прежнему будет содержать ссылку на то, что вы передаете при вызове getUser. Я надеюсь это имеет смысл!

Diljohn5741 25.10.2018 08:19

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

ChillaBee 26.10.2018 09:50
Ответ принят как подходящий

Я вижу здесь два вопроса:

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

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

Подробнее здесь: 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, я думаю ...

ChillaBee 24.10.2018 18:06
  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.info(userObject);
});

Другие вопросы по теме