Spesso capita di scrivere righe di codici uguali in una stessa pagina. Per eliminare queste ripetizioni, si possono usare le funzioni. Un semplice esempio può essere una funzione che stampa la data quando richiesta.
<script language="vbscript">
function stampadata()
document.write WeekdayName (weekday(date)) & " " & day(date) & " " & monthname(month(date))
& " " & year(date)
end function
</script>
<script language="vbscript">
stampadata()
</script>
Si noti come la funzione inizia con l'istruzione function e termina con end function.
Nello script più basso abbiamo la chiamata della funzione, semplicemente scrivendo il suo nome. Una funzione può anche ricevere delle variabili; ad esempio, creiamo una funzione che stampi il fattoriale.
<script language="vbscript">
function fattoriale(numero)
dim c,risultato
risultato=1
for c=1 to numero
risultato=risultato*c
next
document.write "Il fattoriale di " & numero & " è " & risultato
end function
</script>
<script language="vbscript">
fattoriale(5)
</script>
Infine una funzione può anche restituire un valore.
<script language="vbscript">
function fattoriale(numero)
dim c,risultato
risultato=1
for c=1 to numero
risultato=risultato*c
next
fattoriale=risultato
end function
</script>
<script language="vbscript">
document.write "Il fattoriale di 5 è " & fattoriale(5)
</script>
Per farci restituire il valore, è bastato mettere, prima dell'uscita della funzione, il nome della funzione uguale al valore da restituire.
Un altro modo per creare delle funzioni è attraverso il comando SUB. Con il comando SUB si creano procedure. Sia la procedura che le funzioni possono ricevere dei parametri, ma le procedure non restituscono un valore e perciò non si possono usare all'interno di espressioni. Quindi l'ultima istruzione
document.write "Il fattoriale di 5 è " & fattoriale(5)
non può essere generata con una SUB.
Questa procedura stampa una sequenza partendo da valore_iniziale fino a valore_finale con un passo valore_step.
<script language="vbscript">
sub sequenza(valore_iniziale,valore_finale,valore_step)
dim c
for c=valore_iniziale to valore_finale step valore_step
document.write c & "<br>"
next
end sub
</script>
<script language="vbscript">
sequenza 10,50,5
</script>
Come si intuisce le procedure sono molto simili alle funzioni sia nella chiamata che nell'implementazione.
Un lettore attento si sarà accorto che la chiamata della procedura sequenza è stata fatta senza tonde, mentre in precedenza si erano sempre usate le tonde. Vediamo di chiarire la differenza in questo esempio:
<script language="vbscript">
sub incrementa(valore)
valore=valore+1
end sub
</script>
<script language="vbscript">
dim x
x=10
document.write "Il valore di x prima della procedura: " & x & "<br>"
incrementa x
document.write "Il valore di x dopo la procedura: " & x & "<br>"
incrementa (x)
document.write "Il valore di x dopo la procedura (con le parentesi): " & x & "<br>"
</script>
Questo codice produce:
Il valore di x prima della procedura: 10
Il valore di x dopo la procedura: 11
Il valore di x dopo la procedura (con le parentesi): 11
Quando passo x senza tonde il valore di x resta modificato, mentre nel secondo caso x non varia.
Le variabili sono passate alla procedura per riferimento o per valore. Nel passaggio per riferimento passo x, e tutte le operazioni su di essa restano anche dopo che si è conclusa la procedura. Nel passaggio per valore viene passato solo il valore di x, quindi dopo la procedura, la variabile è rimasta intatta. Nella prima chiamata alla procedura, quella senza tonde, si ha un passaggio per riferimento (ByRef), nella seconda, con le tonde, un passaggio per valore (ByVal). Lo stesso principio è valido anche per le funzioni.