Function that passes arguments dynamically to callback

1

How to pass arguments in a callback function (usually anonymous function)?

Maybe it's hard to understand, so I'll give you an example here. I always see this in libraries like jQuery, but I do not understand how it works in "pure" JS.

For example:

// essa é a função que passa um argumento qualquer para dentro de seu callback
function passarArgumento(callback){

}

// função anônima de callback recebe e printa o argumento nos 2 exemplos abaixo
passarAgumento(function(argumento){
      alert(argumento);
})

passarArgumento(function(valor){
      alert(valor);
})

My question is: How does passarArgumento() do to throw the value into the callback, and still have the variable name, as in the example (argument, value)?

Update

Another example is the jQuery ajax function

$.ajax({
   success: function(resposta){
     // a função $.ajax jogou a resposta do request aqui. Como isso é feito?
     alert(resposta);
  }
});
    
asked by anonymous 07.06.2017 / 11:36

1 answer

1

The name of the variable you can change as you want. This is set when you define the callback. To execute this callback and activate alert in your case, just invoke the function. That is:

function passarArgumento(callback){
    callback('aqui passas o que a callback deve retornar');
}

Example:

// essa é a função que passa um argumento qualquer para dentro de seu callback
function passarArgumento(callback, tipo) {
  callback('aqui passas o que a callback deve retornar ' + tipo);
}

// função anônima de callback recebe e printa o argumento nos 2 exemplos abaixo
passarArgumento(function(argumento) {
  alert(argumento);
}, 'A')

passarArgumento(function(valor) {
  alert(valor);
}, 'B')

Another way to see the problem:

When we pass a function as an argument, we do not know when it will be called, or how many arguments it will receive. Who controls this is the time and manner that is invoked.

Example:

function tipoA(callback) {
  callback('vou passar', 'dois argumentos');
}

function tipoB(callback) {
  setTimeout(function() {
    callback('argumento unico, mas atrasado');

  }, 2000);
}

tipoA(function(a, b) {
  console.log(arguments.length, a, b);
})

tipoB(function(a, b) {
  console.log(arguments.length, a, b);
})
    
07.06.2017 / 11:41