-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



giovedì 5 febbraio 2009

Currying in javascript

Una delle caratteristiche delle funzioni javascript è quello di poter essere nitificate.
In sostanza possiamo dichiarare una funzione dentro un'altra funzione.
Ad esempio:

function main(arg)
{

var test ="Esempio di closures";

function child () {

alert (arg + test);

}

child();

}

La funzione child è stata nidificata nella funzione main.
La funzione child può accedere oltre alle sue variabili interne anche alle variabile test ed arg che sono definite fuori da essa.
Se invochiamo la main, ad esempio main ('Test:'), il risultato sarà un alert: 'Test: Esempio di clousures'.

In pratica la funzione child può accedere alle variabili della funzione padre ed alle sue.

La cosa interessante è che se la funzione restituisce la funzione child le variabili della main 'vivono' ancora nella funzione child:


function main(arg)
{

var test ="Esempio di closures";

function child ()

{

alert (arg + test);

}
return child; //<---- return la funzione child()

}

Invece di invocare la funzione child all'interno della main la restituiamo e possiamo testare che le variabili continuano a 'vivere':

var child = main ('Test:');
child();


il risultato sarà un alert: 'Test: Esempio di clousures'.

La funzione child può accedere alle variabili della funzione padre se sono state dichiarate locali. Abbiamo creato la cosiddetta closure.
Dall'esempio abbiamo anche visto che la funzione main definisce due variabili (arg e test) ma noi possiamo chiamare la funzione child senza passare parametri. Abbiamo trasformato una funzione con più parametri in una con meno (in questo caso con zero parametri). Questa tecnica è conosciuta come currying (in computer science).

Un altro esempio per far capire.
Potremmo semplicemente implementare nel prototipo:

Function.prototype.curry = function() {

var fn = this, args = Array.prototype.slice.call(arguments);

return function()
{

return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));

};

};



Caricheremmo i primi argomenti e restituiremmo una funzione con, quindi caricati, questi argomenti. La funzione poi potrà essere utilizzata:
Esempio

function sum(x,y,z) {
return x+y+z;
}


function test() {
var a = sum.curry(2,5); // restituisce la funzione con x e y già precaricati

var b = a(3);
alert(b.toString());

}

Nessun commento: