5

Tengo el siguiente código:

function leerTexto (nombre, callback) {
 process.nextTick(function () {
  var contenido = fs.readFileSync(nombre)
  callback(content.toString())
 })
}

Dejando a un lado lo que hace el código, me gustaria saber porque el argumento de callback se puede poner como ''un tipo de funcion'' o algo asi dentro de la funcion leerTexto. No necesito saber que hace o porque hace las cosas la funcion, lo unico que me gustaria saber es como, porque o de que forma se hace el ''callback(content.toString())'' de esa manera, ya que se me hace extraño porque nunca habia visto un argumento de esa forma. De antemano, muchas gracias.

Ricardo A
  • 975
  • 6
  • 14
  • 29

3 Answers3

1

Lo unico que me gustaria saber es como, porque o de que forma se hace el callback(content.toString());

En JavaScript casi todo es un objeto ya que todo hereda de Object.prototype. Las funciones no son la excepción y es por eso que puedes pasarlas como parámetros, guardaras en un array, un set, map, etc.

Cuando pasas un callback lo que estás pasando es la definición de dicha función, es decir, como tal, un objeto, como si pasases un objeto literal ({ clave: valor }), la instancia de una clase o un tipo de dato primitivo. Una vez dentro de la función primaria, puedes manejarla como cualquier otro tipo de dato o ejecutarla.

Cabe aclarar que un callback es también un closure; esto es, definir una función dentro de otra. Esto le permite reconocer el entorno en el cual se ha creado.

gugadev
  • 18,776
  • 1
  • 24
  • 49
1

Sumando a lo explicado por Guz vale aclarar que esta característica de Javascript que marcas se debe al paradigma de programación funcional.

Javascript es un lenguaje multi paradigma, esto significa que puedes programar con distintos enfoques, gracias a la versatilidad del lenguaje: Procedural, Orientado a Objetos (prototipado) o funcional.

Todos los lenguajes de programación funcional cumplen con una característica que son las Funciones de Orden Superior. Esto significa que una función puede tomar como argumento otra función y además todas las funciones pueden retornar como resultado una nueva función. Es una característica bien poderosa de Javascript que nos permite adentrarnos en el mundo de la programación funcional.

  • Buena respuesta. Sin embargo, creo que no fue muy acertado catalogarlo como *"Orientado a objetos no puro"*. La clásica implementación de la POO que hace Java o C# no es la única y no se debe tomar como referencia de facto. JavaScript solo introduce otro enfoque, que es la [POO prototipada](https://en.wikipedia.org/wiki/Prototype-based_programming) que es lo que hace al lenguaje tan versátil. – gugadev Mar 05 '17 at 21:52
  • De acuerdo estimado! La discusión si JS es POO o no es larga y seguro ocuparía muchisimos threads. Me gustó tu definición, voy a editar ese punto :) – Santiago Barchetta Mar 05 '17 at 21:55
0

La declaración de función leerTexto espera (y exige) una función como segundo parámetro.

Cuando la invocaz, ese segundo parámetro puede ser una función existente:

var loguear=function(texto) {
    console.log(texto);
};

leerTexto('archivo.txt', loguear);

Como puede ser un closure (que mencionan en las otras respuestas) que definas en ese momento:

leerTexto('archivo.txt', function(texto) {
   console.log(texto);
});

En el caso del ejemplo que planteas, si no se le entrega una función como segundo parámetro, leerTexto va a tirar un error.

ffflabs
  • 21,223
  • 25
  • 48