Sigueme por RSS! RSS

Funciones anónimas en nuestros códigos

Una función anónima es una subrutina que no precisa de un nombre (de ahí lo anónimo) y que puede ser usada en cualquier momento. Han sido implementadas en varios lenguajes de programación (en PHP desde la versión 5.3, también conocidas como closures [cierres]).

Normalmente se utilizan cuando un procedimiento se requiere una sola vez y no es necesario nombrar una función para ello.

Para las comparaciones entre una función común y una anónima, me basare en la siguiente:
// devuelve la cantidad de números pares que hay desde el 1 hasta el número dado.
function totalpares(num) {
   var i,c=0;
   for (i=num; i>1; i--) 
      if ((i % 2) == 0) c=c+1;
   alert("El numero " + num + " tiene " + c + " pares!");
};

totalpares(10); // devuelve 5


La sintaxis varía de acuerdo al lenguaje, pero aun así es similar:

Javascript:
(function(){
    // procedimiento
})();

o también:
var miFuncion = function(parametro) {
   // procedimiento 
};

Fíjate que en ningún momento le dimos un nombre a la función.

Ejemplo:
Clic aquí para mostrar u ocultar los ejemplos
- se requiere de un procedimiento que calcule la cantidad de números pares de un numero dado.
// almacenamos a la variable el resultado de una función
var totalpares = function(num) {
   var i,c=0;
   for (i=num; i>1; i--) 
      if ((i % 2) == 0) c=c+1;
   alert("El numero " + num + " tiene " + c + " pares!");
};

// llamamos a la variable pasándole el parámetro que requiere la función anónima ..
totalpares(13); // devuelve 6

en este ejemplo no hace falta hacer ningún llamado
// esta función se ejecuta sola o.O
(function(num){
   var i,c=0;
   for (i=num; i>1; i--) 
      if ((i % 2) == 0) c=c+1;
   alert("El numero " + num + " tiene " + c + " pares!");

})(7); // devuelve 3

Podemos usar funciones anónimas dentro de otras, por ejemplo, para interceptar el envío del formulario:
window.onload =
function()
{
   window.document.forms[0].onsubmit =
   function() {
     alert('se intenta enviar el formulario')  
   };
};


Otro ejemplo al momento de trabajar con JQuery
Clic aquí para mostrar u ocultar los ejemplos

suponiendo que tenemos el siguiente script:
var documento;
documento=$(document);
documento.ready(fInicia);

function fInicia()
{
   var variable;
   variable=$("#buscar");
   variable.focus(fFoco);
}

function fFoco()
{
   var variable=$("#buscar");
   variable.attr("value","");
}

lo podemos simplificar un poco, nos queda así:
var documento;
documento=$(document);
documento.ready(function(){ 
   var variable;
   variable=$("#buscar");

   variable.focus(function() {
      var variable2=$("#buscar");
      variable2.attr("value","");
   });
})


Ahora es el turno de PHP: nota la similitud de la sintaxis:
variable = function () {
    // procedimiento ..
};

$TotalPares = function($num){

for ($i=$num; $i>1; $i--) 
  if (($i % 2) == 0) $c=$c+1; echo $c; 
};

$TotalPares(7);// devuelve 3

Pasando el retorno de una función como argumento:
Clic aquí para mostrar u ocultar los ejemplos
Ejemplo: tenemos el siguiente script
// Función de comparación
function cmp($a, $b) {
    return($a > $b);
}

// Array a ser ordenado
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3);

// Ordenar e imprimir el array resultante
uasort($array, 'cmp');
echo '<pre>',print_r($array),'</pre>'; 

lo simplificando a la siguiente manera:
// Ordenar e imprimir el array resultante
uasort($array, function($a, $b) {
    return($a > $b);
});

echo '<pre>',print_r($array),'</pre>';


PHP nos suministra una función con la cual crear funciones anónimas, Create_function.

create_function crea una función anónima desde los parámetros pasados, y devuelve un nombre único para ella.

Normalmente estos parámetros serán pasados como una cadena entre comillas simples. La razón de usar comillas simples es proteger a los nombres de las variables de ser analizados, de otro modo, si se usan comillas dobles habrá necesidad de escapar los nombres de las variables, p.ej. \$avar.

Puede ser usado para crear funciones en tiempo de ejecución.

Ejemplo:
$av = array("cadena1 ", "cadena2 ", "cadena3 ", "cadena4 ");
array_walk($av, create_function('&$v,$k', '$v = $v . " trozo concatenado" .($k+1);'));
echo '<pre>',print_r($av),'</pre>';

/* devuelve
Array
(
    [0] => cadena1  trozo concatenado1
    [1] => cadena2  trozo concatenado2
    [2] => cadena3  trozo concatenado3
    [3] => cadena4  trozo concatenado4
)
*/

O bien, de la siguiente manera:
$saludo = function($nombre,$apellido=''){
    printf("Hola %s %s <br/>",$nombre,$apellido);
};

$saludo('Ana','Gomez');
$saludo('Luis');

/* devuelve
Hola Ana Gomez
Hola Luis
*/


En resumen, es mucho el código que puedes simplificar si reconoces cuando usarlas apropiadamente.

referencias:
php.net//function.create-function
php.net/functions.anonymous

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.