Oggetto Function ECMAScript (classe)
- Pagina precedente Oggetto arguments
- Pagina successiva Closure (closure)
Le funzioni di ECMAScript sono oggetti funzionali.
Oggetto Function (classe)
Una delle caratteristiche più interessanti di ECMAScript potrebbe essere che le funzioni sono oggetti funzionali.
La classe Function può rappresentare qualsiasi funzione definita dallo sviluppatore.
La sintassi per creare una funzione utilizzando la classe Function è la seguente:
var function_name = new function()arg1, arg2, ... , argN, function_body)
nel seguente formato, ogni arg tutti hanno un solo parametro, l'ultimo parametro è il corpo della funzione (il codice da eseguire). Questi parametri devono essere stringhe.
Ricorda questa funzione?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
può essere definito anche così:
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage)");
Anche se, a causa delle stringhe, è difficile scrivere in questo modo, aiuta a capire che le funzioni sono solo un tipo di riferimento, e il loro comportamento è lo stesso delle funzioni create chiaramente con la classe Function.
Ecco un esempio:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //Output "20"
Come già saprai, la seconda funzione sovraccarica la prima funzione, in modo che doAdd(10) restituisca "20" anziché "30".
Se si riscrive questo blocco di codice nel seguente modo, il concetto diventa chiaro:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Osserva questo pezzo di codice, è ovvio che il valore di doAdd è stato modificato per puntare a un oggetto diverso. Il nome della funzione è solo un valore di riferimento all'oggetto della funzione, e il comportamento è come quello degli altri oggetti. Può anche avere due variabili che puntano alla stessa funzione:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //Output "20" alsodoAdd(10); //Output "20"
In questo contesto, la variabile doAdd viene definita come una funzione, quindi alsodoAdd viene dichiarata come un puntatore che si riferisce alla stessa funzione. Entrambi i variabili possono eseguire il codice della funzione e produrre lo stesso risultato - "20". Pertanto, se il nome della funzione è solo un riferimento alla variabile della funzione, possiamo passare la funzione come parametro a un'altra funzione? La risposta è affermativa!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); // Output "20"
Nel esempio sopra, callAnotherFunc() ha due parametri - la funzione da chiamare e i parametri da passare alla funzione. Questo codice passa doAdd() alla funzione callAnotherFunc(), i parametri sono 10, e l'output è "20".
Attenzione:Nonostante si possa creare una funzione utilizzando il costruttore Function, è meglio non farlo, perché definire una funzione in questo modo è molto più lento rispetto al metodo tradizionale. Tuttavia, tutte le funzioni dovrebbero essere considerate istanze della classe Function.
L'attributo length dell'oggetto Function
Come menzionato in precedenza, le funzioni appartengono al tipo di riferimento, quindi hanno anche attributi e metodi.
L'attributo length definito da ECMAScript dichiara il numero di parametri attesi dalla funzione. Ad esempio:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); // Output "1" alert(sayHi.length); // Output "0"
La funzione doAdd() definisce un parametro, quindi il suo length è 1; sayHi() non definisce parametri, quindi il suo length è 0.
Ricorda, indipendentemente dal numero di parametri definiti, ECMAScript può accettare un numero illimitato di parametri (fino a 25), come spiegato nel capitolo "Panoramica delle funzioni". L'attributo length è solo un modo semplice per visualizzare il numero di parametri attesi di default.
Metodi dell'oggetto Function
L'oggetto Function ha anche i metodi valueOf() e toString() condivisi con tutti gli oggetti. Entrambi i metodi restituiscono il codice sorgente della funzione, particolarmente utili durante il debug. Ad esempio:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Il seguente codice ha outputted il testo della funzione doAdd().Prova direttamente!
- Pagina precedente Oggetto arguments
- Pagina successiva Closure (closure)