что означает обратный вызов в следующем коде? [Дубликат]

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

547
задан Cheekysoft 5 May 2009 в 17:14
поделиться

19 ответов

Одной из важных областей использования является то, что вы регистрируете одну из своих функций как дескриптор (т. е. обратный вызов), а затем отправляете сообщение / вызываете некоторую функцию для выполнения некоторой работы или обработки. Теперь, после завершения обработки, вызываемая функция вызовет нашу зарегистрированную функцию (т. Е. Теперь выполняется обратный вызов), что указывает на то, что обработка выполнена. Эта ссылка wikipedia достаточно хорошо описана графически.

535
ответ дан 8bitjunkie 26 August 2018 в 15:32
поделиться
  • 1
    Ваш пример отличный, но я не понимаю, почему терминология является «обратным вызовом». Когда имеет значение «OfLife», называется «назад»? – CodyBugstein 11 April 2013 в 15:51
  • 2
    Что делать, если функция не передается в качестве аргумента другому методу, а является просто тем, что задано для свойства другого класса и которое вызывается этим классом, когда он этого желает? Например, если у одного класса есть свойство Function для функции регистрации, а другой класс устанавливает это свойство равным функции, которая фактически реализует ведение журнала. Это технический ответ? – Panzercrisis 22 July 2013 в 14:08
  • 3
    Привет, о once its parent method completes, the function which this argument represents is then called. Итак, если функция передается другой функции в качестве аргумента, но вызывается из среды выполнения среды родительской функции, например parent(cb) {dostuff1(); cb(); dostuff2()}, то она не считается функцией callback? – Max Yari 26 April 2015 в 20:30
  • 4
    @ 8bitjunkie спасибо - но где метод valueOfLife, вызываемый внутри функции printANumber? – BKSpurgeon 28 November 2016 в 22:59
  • 5
    @ 8bitjunkie Кажется, что в вашем примере что-то запуталось. Поскольку в printANumber () нет вызова функции senseOfLife (), я предполагаю, что он вызван просто потому, что он передан как аргумент в event (). Но в этом случае не следует выводить значение значения функции OfLife () перед выходом printANumber (6, meanOfLife)? Если нет, может быть, какой-то текст, объясняющий это, будет полезен. – Project 8 March 2017 в 22:44

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

В Javascript или, более конкретно, jQuery, например , вы можете указать аргумент обратного вызова, который будет вызываться, когда анимация завершена.

В PHP функция preg_replace_callback() позволяет вам предоставить функцию, которая будет вызываться при согласовании регулярного выражения, передавая строка (строки), сопоставленные как аргументы.

16
ответ дан alex 26 August 2018 в 15:32
поделиться

Давайте будем простыми. Что такое функция обратного вызова?

Пример по притче и аналогии

У меня есть секретарь. Каждый день я прошу ее: (i) отказаться от исходящей почты фирмы в почтовом отделении, а после она сделала это: (ii) любую задачу, которую я написал для нее на одном из этих липкие заметки .

Теперь, какова задача заметки? Задача меняется изо дня в день.

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

Итак:

  1. во-первых, она необходимо сбрасывать почту и
  2. сразу после выполнения , она должна распечатать некоторые документы.

Функция обратного вызова это вторая задача: распечатать эти документы. Потому что это сделано ПОСЛЕ того, как почта отпадает, а также потому, что клейкая записка, в которой ей сообщается распечатать документ, предоставляется ей вместе с письмом, которое ей нужно больше всего.

Давайте теперь свяжем это с программированием Словарь

  • Имя метода в этом случае: DropOffMail.
  • И функция обратного вызова: PrintOffDocuments. PrintOffDocuments - это функция обратного вызова, потому что мы хотим, чтобы секретарь это сделал, только после того, как DropOffMail запустился.
  • Поэтому я бы «передал: PrintOffDocuments как« аргумент »методу DropOffMail.

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

]
21
ответ дан BKSpurgeon 26 August 2018 в 15:32
поделиться

Обратите внимание, что обратный вызов - это одно слово.

Очень важна страница обратного вызова википедии .

quote from wikipedia page:

В компьютерном программировании обратный вызов является ссылкой на исполняемый код или часть исполняемого кода, который передается в качестве аргумента другому коду. Это позволяет программному уровню более низкого уровня вызывать подпрограмму (или функцию), определенную на уровне более высокого уровня.

87
ответ дан danio 26 August 2018 в 15:32
поделиться
  • 1
    Хороший способ представить ответ. – Chathuranga Chandrasekara 5 May 2009 в 11:24
  • 2
    И это также приводит к ответу по-другому. Существительное "обратный вызов" это то, что было «вызвано назад», так же, как что-то, что прошло после выключения, было закрыто, и что-то, что используется для входа в систему, - это логин. – Anonymous 5 May 2009 в 11:43
  • 3
    Это мог быть комментарий - в основном это ссылка на Википедию – CodyBugstein 11 April 2013 в 15:37
  • 4
    Я вообще не оцениваю этот ответ. – adaam 7 March 2014 в 15:37
  • 5
    У Википедии действительно есть некоторые действительно удивительные вещи программирования в его trove. Мне всегда казалось, что термин «обратный вызов» было лучше всего объяснено с использованием фразы, «Я собираюсь перезвонить ...». – Thomas 23 February 2015 в 22:09

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

- Пол Якубик, «Обратный звонок» Реализации в C ++ "

26
ответ дан DejanLekic 26 August 2018 в 15:32
поделиться
  • 1
    Итак, мое имя и номер являются функцией? – Koray Tugay 22 March 2017 в 19:47

Функция обратного вызова Функция, переданная другой функции в качестве аргумента.

function test_function(){       
 alert("Hello world");  
} 

setTimeout(test_function, 2000);

Примечание: В приведенном выше примере test_function используется как аргумент для функции setTimeout.

0
ответ дан Garvin 26 August 2018 в 15:32
поделиться
  • 1
    Добро пожаловать в переполнение стека! Прежде чем отвечать на вопрос, всегда читайте существующие ответы. Этот ответ уже предоставлен. Вместо того, чтобы повторять ответ, проголосуйте за существующий ответ. Некоторые рекомендации по написанию хороших ответов можно найти здесь здесь . – dferenc 8 January 2018 в 14:14

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

6
ответ дан Humble Coder 26 August 2018 в 15:32
поделиться

Это делает обратные вызовы похожими на операторы возврата в конце методов.

Я не уверен, что это то, что они есть.

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

Я также считаю, что обратные вызовы предназначены для устранения инициирующего вызова, в виде «эй, эта вещь, о которой вы просили? Я это сделал - просто подумал, что дам вам знать - обратно к вам ».

16
ответ дан Mauritico 26 August 2018 в 15:32
поделиться
  • 1
    +1 для опроса «Обратные вызовы» и «Операторы возврата». Я был пойман этим и так много выпускников, с которыми я работаю. – 8bitjunkie 26 September 2011 в 01:38
  • 2
    Хороший ответ - помог мне понять это, в отличие от многих других ответов! – adaam 7 March 2014 в 15:38

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

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

14
ответ дан Michael Petrotta 26 August 2018 в 15:32
поделиться
  • 1
    Это отличная идея. Я пошел за "позвонил сзади". попытаться объяснить это. Я мог видеть кого-то вроде Мартина Фаулера, популяризирующего «звонок после». как новый термин для них на его почтенном блоге. – 8bitjunkie 13 May 2016 в 14:01

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

40
ответ дан NateH 26 August 2018 в 15:32
поделиться

Предположим, что у нас есть функция sort(int *arraytobesorted,void (*algorithmchosen)(void)), где он может принимать указатель на функцию в качестве своего аргумента, который может быть использован в некоторой точке реализации sort(). Затем здесь код, который адресуется указателем функции algorithmchosen, называется функцией обратного вызова.

И видим, что мы можем выбрать любой алгоритм, например:

  1.    algorithmchosen = bubblesort
  2.    algorithmchosen = heapsort
  3.    algorithmchosen = mergesort   ...

, которые, скажем, были реализованы с помощью прототипа:

  1.   `void bubblesort(void)`
  2.   `void heapsort(void)`
  3.   `void mergesort(void)`   ...

Это концепция, используемая для достижения полиморфизма в объектно-ориентированном программировании

5
ответ дан Neeraj 26 August 2018 в 15:32
поделиться
  • 1
    Отличное объяснение на javascriptissexy.com/...; который я буду перепечатывать здесь; Функция обратного вызова - это функция, которая передается другой функции в качестве параметра, а функция обратного вызова вызывается или выполняется внутри другой функции. // Обратите внимание, что элемент в параметре метода click является функцией, а не переменной. // Элемент является функцией обратного вызова $ (& quot; # btn_1 & quot;). Click (function () {alert (& quot; Btn 1 Нажмите «& quot;);}); Как вы видите в предыдущем примере, мы передаем функцию в качестве параметра методу click для его выполнения - – MarcoZen 22 April 2015 в 16:27

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

$("#button_1").click(function() {
  alert("button 1 Clicked");
});

Здесь мы передаем функцию как параметр методу щелчка. И метод click вызовет (или выполнит) функцию обратного вызова, которую мы передали ей.

1
ответ дан Nisse Engström 26 August 2018 в 15:32
поделиться
  • 1
    Функция обратного вызова сама по себе не является функцией более высокого порядка. Он передается функции более высокого порядка. – danio 1 March 2016 в 17:19

Что такое обратный вызов?

  • Как правило, телефонный звонок, сделанный для возврата того, что кто-то получил.
  • При вычислении callback является частью исполняемого кода, который передается в качестве аргумента другому коду. Когда функция выполняется с ее работой (или при возникновении какого-либо события), она вызывает функцию обратного вызова (она вызывает вас обратно - отсюда и название).

Что такое функция обратного вызова?

  • Функция обратного вызова подобна Слуге, который «обращается» к своему Учителю, когда он выполнил задачу.
  • Функция обратного вызова - это функция, которая передается другой функции (назовем эту другую функцию otherFunction) в качестве параметра, а функция обратного вызова (или выполняется) внутри otherFunction. function action (x, y, callback) {return callback (x, y); } умножение функции (x, y) {return x * y; } сложение функции (x, y) {return x + y; } alert (действие (10, 10, умножение)); // output: 100 alert (действие (10, 10, дополнение)); // output: 20

В SOA обратный вызов позволяет модулям плагина получать доступ к сервисам из контейнера / среды.

Аналогия: обратные вызовы. Асинхронный. Неблокирование Пример реальной жизни для обратного вызова

3
ответ дан Premraj 26 August 2018 в 15:32
поделиться
  • 1
    Функция обратного вызова сама по себе не является функцией более высокого порядка. Он передается функции более высокого порядка. – danio 1 March 2016 в 17:19
179
ответ дан Rohit Chatterjee 26 August 2018 в 15:32
поделиться

посмотрите на изображение:) this is how it works [/g0]

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

Наконец, функция библиотеки вызывает функцию обратного вызова во время выполнения.

7
ответ дан Saumya Suhagiya 26 August 2018 в 15:32
поделиться

«В компьютерном программировании обратный вызов является ссылкой на исполняемый код или часть исполняемого кода, который передается в качестве аргумента другому коду. Это позволяет программному слою более низкого уровня вызывать подпрограмму (или функцию), определенную на уровне более высокого уровня ». - Wikipedia

Обратный вызов в C с использованием указателя функции

В C, обратный вызов реализуется с помощью Function Pointer. Функциональный указатель - как следует из названия, является указателем на функцию.

Например, int (* ptrFunc) ();

Здесь ptrFunc является указателем на функцию, которая не принимает аргументов и возвращает целое число. Не забудьте указать в скобках, иначе компилятор предположит, что ptrFunc - это нормальное имя функции, которое ничего не принимает и возвращает указатель на целое число.

Вот какой код для демонстрации функции.

#include<stdio.h>
int func(int, int);
int main(void)
{
    int result1,result2;
    /* declaring a pointer to a function which takes
       two int arguments and returns an integer as result */
    int (*ptrFunc)(int,int);

    /* assigning ptrFunc to func's address */                    
    ptrFunc=func;

    /* calling func() through explicit dereference */
    result1 = (*ptrFunc)(10,20);

    /* calling func() through implicit dereference */        
    result2 = ptrFunc(10,20);            
    printf("result1 = %d result2 = %d\n",result1,result2);
    return 0;
}

int func(int x, int y)
{
    return x+y;
}

Теперь попробуем понять концепцию Callback в C, используя указатель функции.

Полная программа имеет три файла: callback.c, reg_callback.h и reg_callback. c.

/* callback.c */
#include<stdio.h>
#include"reg_callback.h"

/* callback function definition goes here */
void my_callback(void)
{
    printf("inside my_callback\n");
}

int main(void)
{
    /* initialize function pointer to
    my_callback */
    callback ptr_my_callback=my_callback;                        
    printf("This is a program demonstrating function callback\n");
    /* register our callback function */
    register_callback(ptr_my_callback);                          
    printf("back inside main program\n");
    return 0;
}

/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);


/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"

/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
    printf("inside register_callback\n");
    /* calling our callback function my_callback */
    (*ptr_reg_callback)();                               
}

Если мы запустим эту программу, выход будет

. Это программа, демонстрирующая обратный вызов функции внутри register_callback внутри my_callback внутри основной программы

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

Обратный вызов в Java с использованием интерфейса

Java не имеет понятия указателя функции Он реализует механизм обратного вызова через свой интерфейсный механизм ism Здесь вместо указателя функции мы объявляем интерфейс, имеющий метод, который будет вызываться, когда вызывающий заканчивает свою задачу

. Позвольте мне продемонстрировать это через пример:

Интерфейс обратного вызова

public interface Callback
{
    public void notify(Result result);
}

Caller или класс более высокого уровня

public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee

//Other functionality
//Call the Asynctask
ce.doAsynctask();

public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}

Функция Callee или нижнего уровня

public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}

doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}

Обратный вызов с использованием шаблона EventListener

  • Элемент списка

Этот шаблон используется для уведомления от 0 до n номеров наблюдателей / слушателей о завершении конкретной задачи

  • Элемент списка

Разница между механизмом обратного вызова и механизмом EventListener / Observer заключается в том, что при обратном вызове вызывающий абонент уведомляет одного вызывающего абонента, тогда как в Eventlisener / Observer вызывающий может уведомить любого, кто интересуется в этом случае (уведомление может перейти к некоторым другим частям приложения, которое не вызвало задачу).

Позвольте мне объяснить это на примере.

Интерфейс событий

public interface Events {

public void clickEvent();
public void longClickEvent();
}
[g2 4] Class Widget

package com.som_itsolutions.training.java.exampleeventlistener;

import java.util.ArrayList;
import java.util.Iterator;

public class Widget implements Events{

    ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>(); 
    ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();

    @Override
    public void clickEvent() {
        // TODO Auto-generated method stub
        Iterator<OnClickEventListener> it = mClickEventListener.iterator();
                while(it.hasNext()){
                    OnClickEventListener li = it.next();
                    li.onClick(this);
                }   
    }
    @Override
    public void longClickEvent() {
        // TODO Auto-generated method stub
        Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
        while(it.hasNext()){
            OnLongClickEventListener li = it.next();
            li.onLongClick(this);
        }

    }

    public interface OnClickEventListener
    {
        public void onClick (Widget source);
    }

    public interface OnLongClickEventListener
    {
        public void onLongClick (Widget source);
    }

    public void setOnClickEventListner(OnClickEventListener li){
        mClickEventListener.add(li);
    }
    public void setOnLongClickEventListner(OnLongClickEventListener li){
        mLongClickEventListener.add(li);
    }
}

Клавиша класса

public class Button extends Widget{
private String mButtonText;
public Button (){
} 
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}

Клавиша класса

public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}

Класс активности

package com. som_itsolutions.training.java.exampleeventlistener;

public class Activity implements Widget.OnClickEventListener
{
    public Button mButton;
    public CheckBox mCheckBox;
    private static Activity mActivityHandler;
    public static Activity getActivityHandle(){
        return mActivityHandler;
    }
    public Activity ()
    {
        mActivityHandler = this;
        mButton = new Button();
        mButton.setOnClickEventListner(this);
        mCheckBox = new CheckBox();
        mCheckBox.setOnClickEventListner(this);
        } 
    public void onClick (Widget source)
    {
        if(source == mButton){
            mButton.setButtonText("Thank you for clicking me...");
            System.out.println(((Button) mButton).getButtonText());
        }
        if(source == mCheckBox){
            if(mCheckBox.isChecked()==false){
                mCheckBox.setCheck(true);
                System.out.println("The checkbox is checked...");
            }
            else{
                mCheckBox.setCheck(false);
                System.out.println("The checkbox is not checked...");
            }       
        }
    }
    public void doSomeWork(Widget source){
        source.clickEvent();
    }   
}

Другой класс

public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event                        //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}

Основной класс

public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}

Как вы можете видеть из приведенного выше кода , что у нас есть интерфейс, называемый событиями, который в основном перечисляет все события, которые могут произойти для нашего приложения. Класс Widget является базовым классом для всех компонентов пользовательского интерфейса, таких как Button, Checkbox. Эти компоненты пользовательского интерфейса являются объектами, которые фактически получают события из кода структуры. Класс Widget реализует интерфейс Events, а также имеет два вложенных интерфейса: OnClickEventListener & amp; OnLongClickEventListener

Эти два интерфейса отвечают за прослушивание событий, которые могут возникнуть в компонентах пользовательского интерфейса, созданных Widget, таких как Button или Checkbox. Поэтому, если мы сравним этот пример с предыдущим примером обратного вызова с использованием интерфейса Java, эти два интерфейса работают как интерфейс обратного вызова. Таким образом, код более высокого уровня (здесь Activity) реализует эти два интерфейса. И всякий раз, когда событие возникает с виджетами, вызывается код более высокого уровня (или метод этих интерфейсов, реализованный в коде более высокого уровня, который является здесь Activity).

Теперь позвольте мне обсудить основную разницу между обратным вызовом и шаблоном Eventlistener. Как мы уже упоминали, используя Callback, Callee может уведомлять только одного Caller. Но в случае шаблона EventListener любая другая часть или класс приложения может регистрироваться для событий, которые могут возникнуть на кнопке или флажке. Примером такого класса является OtherClass. Если вы видите код OtherClass, вы обнаружите, что он зарегистрировался как прослушиватель ClickEvent, который может возникнуть в Button, определенной в Activity. Интересная часть состоит в том, что помимо Activity (Caller) этот OtherClass также будет уведомлен о каждом событии click на Button.

3
ответ дан somenath mukhopadhyay 26 August 2018 в 15:32
поделиться

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

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

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

37
ответ дан Thomas Bratt 26 August 2018 в 15:32
поделиться
  • 1
    В первом предложении вы говорите "...when a condition is met", но я думал, что обратные вызовы вызываются, когда родительская функция завершает выполнение и не зависит от условий (?). – ojonugwa ochalifu 25 July 2014 в 09:59
  • 2
    «Некоторое условие» просто означает, что их обычно называют причиной, а не случайным образом. Обратный вызов можно вызвать, когда родитель / создатель все еще выполняет - это может привести к состоянию гонки, если программист этого не ожидает. – Thomas Bratt 26 July 2014 в 13:37
  • 3
    Хорошо. Спасибо за разъяснение – ojonugwa ochalifu 26 July 2014 в 14:10

Функция обратного вызова - это функция, которую вы передаете (как ссылку или указатель) определенной функции или объекту. Эта функция или объект будет вызывать эту функцию в любое время позже, возможно, несколько раз для любой цели:

  • , уведомляя о завершении задачи
  • , запрашивая сравнение между двумя item (например, в c qsort ())
  • сообщает о ходе процесса
  • , уведомляя события
  • делегируя инициализацию объекта
  • делегирование картины области

...

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

0
ответ дан XouDo 26 August 2018 в 15:32
поделиться

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

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

Я думаю, что люди просто прочитали первое предложение определения wiki:

обратный вызов - это ссылка на исполняемый код или часть исполняемого кода, которая передается как аргумент другому коду.

Я работал с большим количеством API-интерфейсов, смотрю различные плохие примеры. Многие люди имеют тенденцию называть указатель на функцию (ссылку на исполняемый код) или анонимные функции (часть исполняемого кода) «обратный вызов», если они являются просто функциями, для чего вам нужно другое имя для этого?

Фактически только второе предложение в определении wiki показывает различия между функцией обратного вызова и нормальной функцией:

Это позволяет программному уровню более низкого уровня вызывать подпрограмму (или функцию), определенную в более высоком слой уровня.

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

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

34
ответ дан Zane XY 26 August 2018 в 15:32
поделиться
  • 1
    Ваш ответ имеет смысл ... но у меня проблемы с этим. Можете ли вы привести пример? – CodyBugstein 11 April 2013 в 15:56
  • 2
    @ Zane Wong :: В последнем вы написали «Определение говорит, что ваша переданная функция будет вызвана« нижним уровнем », . Функция & Quot; Не могли бы вы объяснить, что означает функция нижнего уровня? Лучше, если вы приведете пример. – Kenta 23 January 2014 в 16:44
  • 3
    Пример был бы приятным – Yousuf Azad 24 July 2016 в 07:09
Другие вопросы по тегам:

Похожие вопросы: