1. Corso Data Journalist gen-mar 2017
TECNOLOGIE WEB AVANZATO
Esecuzione asincrona
Funzioni closure e callback
2. Costruzione di una funzione
Dichiarazione tramite il comando function
var SUM= function(N1,N2){
// This function does sum of two number
console.log('Sum is running')
S=N1+N2;
return S
}
Assegnazione ad una variabile
function SUM(N1,N2){
// This function does sum of two number
console.log('Sum is running')
S=N1+N2;
return S
}
Medesima chiamata
SUM(12,34)
In un programma è possibile inserire la
chiamata della funzione prima della sua
costruzione
E’ possibile utilizzare una funzione come
parametro di un’altra funzione
E’ possibile vedere questo caso come
l’assegnazione di una funzione anonima ad una
variabile/indirizzo di memoria
3. Funzioni autoeseguite - 1
( function() {return 'Hello'; } ) () ; E’ eseguita immediatamente
var TESTO='Questo è un testo';
(function(TESTO){console.log(TESTO);})();
console.log(TESTO);
Produce un errore perchè la funzione è
eseguita prima dell’assegnazione alla
variabile TESTO
4. Funzioni autoeseguite - 2
var FUNC1= (function(){
var WORD
return function(WORD){console.log('****** ',WORD)};
})();
Il risultato di una funzione autoeseguita può essere a sua
volta una funzione
5. Ambito (scope) delle variabili: la parola chiave var
Programma Main
Ambito globale
var NUM1=10
var STR1=’Hello’
Funzione Elab(N1,N2)
Ambito locale
var E1, E2, RIS;
E1=N1*N2-100
E2=30*(N2-N1)
RIS=E1/E2
return RIS
Ambito globale
TEXT=’Testo globale’
6. Funzioni closure (variabili private) - 1
Obiettivo: vogliamo costruire una funzione Add che lanciata in qualunque punto del
programma incrementi di uno il contatore COUNT
Soluzione debole (variabile globale COUNT)
var COUNT= 0;
function Add() {
COUNT=COUNT+1
}
Il problema: tutti i programmi possono
modificare COUNT;
Soluzione sbagliata (variabile locale COUNT)
function Add() {
var COUNT= 0;
COUNT=COUNT+1
}
Il problema: tutte le volte che eseguo Add(),
COUNT assume il valore 1;
7. Funzioni closure (variabili private) - 2
Soluzione ottima (funzione closure): costruisco una funzione che si auto-invoca,
con una variabile locale COUNT e che restituisce una funzione che incrementa
COUNT
var Add = ( function () {
var COUNT = 0;
return function () {return COUNT=COUNT+1;}
}) ( );
dopo l’esecuzione del programma:
COUNT è una variabile locale di Add()
Add()={return COUNT=COUNT+1;}
8. Funzione callback: l’esigenza
function FP1(ARG1, ARG2){
var SUM = ARG1+ARG2;
return SUM}
function FP2(TEXT){
console.log("****" + TEXT);}
var SOMMA=FP1(15,5)
FP2(SOMMA)
Si consideri le seguenti dichiarazioni
di due funzioni
e la loro esecuzione
Poichè le istruzioni javascript sono eseguite in modo asincrono, non è
garantito che la seconda chiamata sia eseguita dopo la prima. Nel caso in
cui questo non avvenisse, il programma produce un errore.
9. Funzione callback: la soluzione
function FP(ARG1, ARG2, CallBack){
//parte 1
var SUM = ARG1+ARG2;
//parte 2
CallBack(SUM) }
FP(15,5, function(T){
console.log("****" +T);
} )
Si consideri la seguente funzioni e la sua esecuzione
In questo caso, la funzione rappresentata dalla parte2 verrà sempre
eseguita dopo la parte 1