JavaScripot FunzioniTrattare funzioni come oggetti
Problema che si desidera approfittare del fatto che le funzioni sono oggetti (ricordate, ogni cosa è un oggetto in JavaScript). Theory Molte persone pensano che una funzione è una parola usata in JavaScript. Una funzione è anche un oggetto che può essere manipolato. Sapendo che una funzione è un oggetto lo rende molto interessante dal punto di vista della scrittura di codice JavaScript, perché il codice può trattare la funzione come un altro oggetto. Ciò significa che è possibile assegnare le funzioni a variabili, proprietà della classe, e ciò che hai. Solution Un modo di utilizzare questa funzionalità è quello di implementare il pattern Factory per restituire un oggetto funzione. Ad esempio, in Ajax ci sono due modi per creare un'istanza dell'oggetto XMLHttpRequest, e il metodo utilizzato dipende dal browser. Il pattern Factory è utilizzato per separare l'interfaccia con l'applicazione. Di solito significa che l'attuazione di un interfaccia, ma perché JavaScript è un linguaggio dinamico, non vi è alcuna nozione reale di un'interfaccia. In un linguaggio dinamico, l'interfaccia non è necessario perché è possibile chiamare un metodo direttamente senza la necessità di un tipo specifico. In caso di istanza dell'oggetto XMLHttpRequest, il pattern Factory restituisce un riferimento alla funzione che può essere utilizzato per creare un'istanza di XMLHttpRequest usando la tecnica appropriata . In JavaScript, una funzione è un oggetto che può essere assegnato a una variabile. Un modo di attuazione della fabbrica che crea un'istanza di XMLHttpRequest è quello di utilizzare le assegnazioni funzione. L'attuazione completa è la seguente. Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html funzione InstantiateIEXMLHttpRequest () (return new ActiveXObject ( "Microsoft.XMLHTTP");) InstantiateOthersXMLHttpRequest function () (return new XMLHttpRequest ();) FactoryXMLHttpRequest function () (if (window. XMLHttpRequest) (return InstantiateOthersXMLHttpRequest;) else if (window.ActiveXObject) (return InstantiateIEXMLHttpRequest;) throw new Error ( "Impossibile istanziare XMLHttpRequest");) Nell'esempio precedente, la funzione FactoryXMLHttpRequest è l'implementazione del pattern Factory. All'interno della funzione di implementazione sono due istruzioni if che verificare quale browser è in esecuzione. A seconda del browser, l'istruzione return restituisce un riferimento sia alle funzioni InstantiateIEXMLHttpRequest o la funzione InstantiateOthersXMLHttpRequest. In entrambi i casi, il riferimento restituito è una funzione che verrà creata un'istanza dell'oggetto XMLHttpRequest. Il codice che utilizza il metodo FactoryXMLHttpRequest segue. Fonte: / website / ROOT / ajaxrecipes / javascript / factory_function functionsareobjects.html: function () (var InstantiateXMLHttpRequest = FactoryXMLHttpRequest (); var xmlhttp = InstantiateXMLHttpRequest (); assertNotNull (xmlhttp);), Si noti l'esempio di come la variabile InstantiateXMLHttpRequest può essere trattata come una funzione. A fini illustrativi, la variabile InstantiateXMLHttpRequest utilizza una combinazione di lettere maiuscole e minuscole per illustrare che, quando la variabile è chiamata, appare come una chiamata di funzione. Basata su identificativo e il contesto in cui la variabile è usato come una funzione, non si saprebbe che la variabile non è una funzione. Questo è un punto molto importante, perché dimostra che una funzione è solo un altro oggetto. FactoryXMLHttpRequest è codificato utilizzando un approccio tradizionale: il codice dichiara una funzione che quando viene chiamato restituirà un'istanza di una funzione. Il comportamento del codice è determinata dopo il codice è stato analizzato e inizializzato. Con JavaScript, questo non è necessario, perché è possibile inizializzare le funzioni quando il codice viene analizzata per ottimizzarlo. Ad esempio, si potrebbe riscrivere il codice FactoryXMLHttpRequest come segue. Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html In sede di attuazione la modifica, il codice utilizzato per assegnare la variabile InstantiateXMLHttpRequest viene eseguito come la pagina HTML viene caricata. Così, ogni volta che la variabile InstantiateXMLHttpRequest si fa riferimento in funzione, il modo appropriato di un'istanza di XMLHttpRequest viene eseguito. Non c'è bisogno di chiamare una fabbrica e prendere una decisione ogni volta che la funzione è chiamata. Questa capacità di trattare le funzioni come oggetti aggiunge un aspetto interessante di codifica, in quanto il comportamento del codice può essere determinato in fase di runtime. Dove normalmente si usa una struttura di decisione per determinare il comportamento del caso, una variabile assegnato dinamicamente può essere utilizzato. Dato che una funzione è un oggetto, ci sono ulteriori possibilità di codifica. Per esempio, è possibile assegnare dinamicamente le proprietà e metodi per una funzione, come mostrato nell'esempio seguente. Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html funzione FunctionFunctionProperties (cmpval) (assertEquals (cmpval, FunctionFunctionProperties.value);) var VariableFunctionProperties = function (cmpval) (assertEquals (cmpval, VariableFunctionProperties.value);) startIndex var = VariableFunctionProperties . toString (). indexOf ("{"); endIndex var = VariableFunctionProperties.toString (). lastIndexOf ("}"); var buffer = VariableFunctionProperties.toString (). slice (startIndex + 1, endIndex); var InstantiatedFunctionProperties = new funzione ( "cmpval", buffer); Questo esempio mostra tre dichiarazioni di funzione, con ciascuna dichiarazione di illustrare un modo diverso di dichiarare una funzione di esempio. La prima dichiarazione, FunctionFunctionProperties, è il metodo tradizionale. La seconda dichiarazione, VariableFunctionProperties, utilizza una variabile e una funzione anonima. E la dichiarazione di terzo, InstantiatedFunctionProperties, è un'istanza esplicita della oggetto Function, dove i parametri di costruzione rappresentano la dichiarazione dei parametri, e l'ultimo parametro è il corpo della funzione. Il corpo della funzione è un buffer di codice JavaScript che viene convertito in eseguibile JavaScript. Per ciascuno dei tre implementazioni funzione, il nome della funzione viene fatto riferimento e aggiunge con un riferimento al valore della proprietà. Con ogni istanza funzione è possibile assegnare una proprietà o, se lo desiderano, un altro riferimento alla funzione. Si può pensare di proprietà come un modo per dichiarare una variabile statica che è associato con la funzione. Poiché ciascuno dei tre dichiarazioni di funzione rappresenta un oggetto e una variabile, che può essere chiamato in maniera identica, come illustrato nel seguente esempio. Fonte: / website / ROOT / ajaxrecipes / javascript / function_with_properties functionsareobjects.html: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();), La lettura del codice che chiama le funzioni dichiarate prende un po 'di abituarcisi. Prima di ogni chiamata di funzione, l'identificatore viene utilizzato come se fosse un oggetto. Dopo che l'oggetto si fa riferimento, l'oggetto si chiama come una funzione. Questi esempi indicano chiaramente che le funzioni hanno una duplice natura, dove le funzioni sono oggetti e gli oggetti possono essere le funzioni. Questa duplice natura pone un problema: in che modo la funzione di implementazione conoscere l'istanza della funzione? Il codice riportato di seguito illustra questo problema. Fonte: / website / ROOT / ajaxrecipes / javascript / function_with_properties functionsareobjects.html: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();), La lettura del codice che chiama le funzioni dichiarate prende un po 'di abituarcisi. Prima di ogni chiamata di funzione, l'identificatore viene utilizzato come se fosse un oggetto. Dopo che l'oggetto si fa riferimento, l'oggetto si chiama come una funzione. Questi esempi indicano chiaramente che le funzioni hanno una duplice natura, dove le funzioni sono oggetti e gli oggetti possono essere le funzioni. Questa duplice natura pone un problema: in che modo la funzione di implementazione conoscere l'istanza della funzione? Il codice riportato di seguito illustra questo problema. Fonte: / website / ROOT / ajaxrecipes / javascript / GetFunction funzione functionsareobjects.html () (return function (cmpvalue) (assertEquals (cmpval, unknownfunctioninstance. value);)) In questo esempio, la funzione GetFunction ha un'implementazione che restituisce un'istanza unica funzione di ogni GetFunction tempo è chiamato. Se si volesse fare riferimento a una proprietà della funzione di esempio, si farebbe fatica a farlo, perché una funzione anonima non ha associato un identificativo. Negli esempi precedenti, il riferimento alla funzione di esempio è stato utilizzato per fare riferimento alla proprietà e metodi dell'oggetto funzione. L'utilizzo di questo modo di dichiarare la funzione, non vi è alcun identificativo associato ad esempio, e non c'è modo di essere in grado di fare riferimento alla proprietà della funzione anonima. La soluzione è quella di utilizzare una variabile interna che si fa riferimento, come dimostra il seguente esempio. Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html funzione GetFunctionFixed () (var inst = function (cmpval) (assertEquals (cmpval, inst.value);) inst return;) Come il codice che risolve il problema della istanza sconosciuto in realtà anche le opere possono sembrare un po 'misteriosa in un primo momento. Essa implica l'uso di una tecnica di programmazione comunemente conosciuto come un chiusura. Per capire come chiusure di lavoro, ricorda di pensare di una funzione come un oggetto, non una parola chiave function costruire. Ecco cosa succede in poche parole: 1. Il chiamante chiama GetFunctionFixed. 2. L'attuazione di GetFunctionFixed viene eseguito. 3. Una funzione anonima è dichiarata, e un oggetto funzione viene istanziato. 4. La funzione di un'istanza anonimo è assegnato al locale ha dichiarato inst variabile. 5. L'inst anonimo riferimenti funzione, e il processore JavaScript capisce questo e crea un riferimento alla variabile locale dichiarata. 6. La variabile inst viene restituito al chiamante. 7. I tentativi garbage collector di garbage collection inst, ma non può perché i riferimenti anonimo funzione inst finché anonime si fa riferimento da qualche parte. Quando si considera la procedura descritta in questo processo, unitamente al fatto che tutto è un oggetto, diventa facile capire come Questo codice funziona. Quando un riferimento oggetto un altro oggetto, gli oggetti possono essere raccolti i rifiuti, se non fare niente di riferimento. Quando si utilizzano le funzioni e di trattarle come oggetti, a mantenere i seguenti punti in mente: • le funzioni sono oggetti, e si può manipolare a loro come qualsiasi altro oggetto JavaScript. Tuttavia, poiché le funzioni sono oggetti, utilizzando le funzioni in modo improprio o proprietà delle funzioni in modo improprio può causare Perdite di memoria, Dove la memoria viene fatto riferimento, e non rifiuti raccolti, anche se lo script non è che si avvalgono della memoria. • Una configurazione delle funzioni o metodi è possibile quando la pagina HTML viene caricata. Ciò consente di risparmiare l'elaborazione logica, in quanto il codice non ha bisogno di stabilire quale codice deve essere eseguito. • Ci vuole un po 'di tempo e di sperimentazione per abituarsi all'idea che il comportamento del codice è determinato in fase di runtime, e non mentre si sta scrivendo il codice. • Essere oggetti, le funzioni possono proprietà o metodi di riferimento, consentendo funzioni per definire il comportamento in fase di runtime. Se si assegna le proprietà oi metodi di funzioni, lo faccia con la consapevolezza che le proprietà ei metodi sono transitori che, se una funzione è copiato da un caso all'altro, non si assumono che le proprietà vengono copiati troppo. un articolo presentato da Sonja Lande Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni. Importante: Questo articolo "JavaScripot Funzioni" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.
|
|||||
| Online: 245 users browsing the articles directory |
|
|