Utilizzando le funzioni di inizializzazione e prendere decisioni JavaScript

Utilizzando le funzioni di inizializzazione e prendere decisioni Problema che si desidera utilizzare le funzioni per inizializzare e prendere decisioni. Theory Di solito quando si scrive un pezzo di codice in cui un cambiamento di logica deve avvenire sulla base di un contesto, si utilizza una struttura di decisione. Per esempio, dicono che sei l'attuazione di un interruttore della luce utilizzando un programma. Si accende la luce se la luce è spenta, e si spegne la luce se la luce è accesa. Il comportamento del programma è determinata dalle condizioni. Un comportamento esempio che merita uno sguardo più attento è l'inizializzazione. Inizializzazione del genere dovrebbe accadere soltanto se non sia già. Inizializzazione è importante perché la logica di inizializzazione crea il quadro di default per l'applicazione per funzionare correttamente. Soluzione Per scopi illustrativi, let's go attraverso un esempio in cui una funzione richiede una inizializzazione che è incorporato all'interno della funzione. La logica è quella di eseguire una inizializzazione, se non si è già verificato. La funzione che viene chiamata è definito come segue, e incorpora una chiamata al di inizializzazione.

  

Suggerimento Si potrebbe usare questo tipo di codice per implementare un inizializzazione pigra quando si scrive codice basato sulla convenzione che non esegue uno di inizializzazione esplicita.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html funzione ClassicalManipulateObject (obj) (info ( "ClassicalManipulateObject", "Starting"); if (! didInitialize) ( DoInitialization (obj); ) else ( info ( "ClassicalManipulateObject", "no inizializzazione necessario"); )assertEquals (3, obj.value); info ( "ClassicalManipulateObject", "Ending");)

 

In questo esempio, il codice in grassetto si riferisce alla funzionalità di inizializzazione. didInitialize è una variabile flag che possono essere vere o false. Se il didInitialize variabile è falsa, allora l'inizializzazione non ha avuto luogo, se la didInitialize variabile è vero, allora l'inizializzazione ha avuto luogo. Se l'inizializzazione non ha avuto luogo, la funzione DoInitialization si chiama. Si noti che nella logica è una variabile che rappresenta se l'inizializzazione ha preso posto e una funzione per fare l'inizializzazione. Questo codice è problematico perché la variabile deve essere definita da qualche parte, e la variabile deve essere assegnato correttamente da qualche parte. E da qualche parte c'è un riferimento incrociato tra la variabile di stato e la chiamata della funzione di inizializzazione. Una soluzione è quella di incorporare gran parte della logica di inizializzazione nel contesto della funzione DoInitialization. Ma il fatto è che da qualche parte c'è una variabile, e da qualche parte c'è una funzione di inizializzazione, e da qualche parte c'è un riferimento incrociato tra la variabile e la funzione di inizializzazione. Allora, dove si inserisce la logica è irrilevante in un quadro "grande" senso.

Un'altra soluzione è quella di pensare non le funzionalità di inizializzazione di una decisione, ma come uno stato. Vi è uno stato iniziale, che è quello di eseguire una inizializzazione, e un altro Stato per eseguire alcuna inizializzazione. In un certo senso, la didInitialize variabile è una rappresentazione dello stato. Mantenere questo pensiero in mente, sai che JavaScript tratta le sue funzioni come oggetti. Così, il didInitialize variabile potrebbe essere una funzione e non una variabile booleana. Trattare lo Stato come una variabile che fa riferimento a una funzione consente di semplificare la funzione che richiede una inizializzazione. L'attuazione della funzione ClassicalManipulateObject è cambiato in ManipulateObject, come illustrato nel codice seguente.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html funzione ManipulateObject (obj) (info ( "ManipulateObject", "Starting"); InitializeObject (obj);assertEquals (3, obj.value); info ( "ManipulateObject", "Ending");)

In sede di attuazione la modifica, il codice in grassetto rappresenta di nuovo la funzionalità di inizializzazione. Qui non c'è nessuna decisione solo una chiamata di funzione per InitializeObject. Si potrebbe pensare, "avrei potuto fare la stessa cosa con la decisione di inizializzazione-based, in quanto la decisione è implementato in InitializeObject." Ma questo non è corretto, perché l'attuazione della InitializeObject, non vi è alcuna decisione. L'attuazione del InitializeObject inizializza la variabile e permette quindi l'elaborazione di continuare. Se non vi è alcuna decisione sulla questione se l'inizializzazione si è verificato, e InitializeObject rappresenta una funzione per inizializzare lo stato, allora per ogni chiamata lo Stato sarà inizializzato non si può chiamare questa funzionalità di inizializzazione. La magia sta nel fatto che le funzioni JavaScript tratta, come oggetti. L'attuazione di InitializeObject è la seguente:

funzione InitializeObject (obj) (obj.value = 3; info ( "InitializeObject", "fare l'inizializzazione"); InitializeObject = InitializeEmptyObject;)

Per l'attuazione del InitializeObject, il parametro obj viene inizializzata ad un valore di 3, e il codice in grassetto indica il mutamento della funzione InitializeObject. I riferimenti riassegnato InitializeObject una funzione senza corpo, il che significa che la prima volta InitializeObject è chiamato, l'inizializzazione viene eseguita, ma, successivamente, ogni chiamata è una chiamata vuoto funzione che non fa nulla.

Questa è l'applicazione completa delle funzionalità di inizializzazione senza l'utilizzo di una singola decisione o variabile. Un vantaggio di questo approccio è che non hai bisogno di capire quale variabile di riferimento incrociato con la funzione. La funzione prende cura di se stesso, e il chiamante può continuare ad invocare InitializeObject, sapendo che tutto sarà curato. Un altro vantaggio di questo approccio è che si sta creando un motore di Stato in cui lo stato successivo è determinato dalla esecuzione dello stato attuale . Non c'è una posizione centrale di blocco decisionale che determina il flusso globale di esecuzione e deve essere aggiornata ogni volta che un nuovo Stato deve essere integrata. Normalmente, quando la scrittura di codice in un linguaggio come Java, C # o C + +, non andare in giro la riassegnazione l'attuazione della funzione definita. E perché questo comportamento è radicato nelle menti degli sviluppatori ', non prendono nemmeno in considerazione di farlo. Eppure non vi è alcun problema di diversa destinazione d'uso in JavaScript, poiché le funzioni sono oggetti. Funzioni non sono identificatori univoci con funzionalità uniche, come si pensa di loro quando si lavora con loro in altre lingue.

L'attuazione di InitializeObject opere ed è una soluzione completa. Ma c'è un piccolo inconveniente che, una volta InitializeObject è stato assegnato ad una funzione vuota, la funzionalità di inizializzazione è persa fino a quando la pagina HTML viene aggiornata. Per alcuni problemi, che è una soluzione accettabile. Ad esempio, si avvolgono XMLHttpRequest solo una volta, perché è possibile creare un'istanza XMLHttpRequest solo in un browser certo modo specifico. Ci sono alcuni casi, tuttavia, quando si potrebbe desiderare di reset e inizializzare di nuovo, e di essere in grado di farlo, hai bisogno di avvolgere InitializeObject in una funzione all'interno di una funzione, come mostrato nell'esempio seguente.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html funzione ResetInitializeObject () (InitializeObject = function (obj) (obj.value = 3; info ( "InitializeObject", "fare l'inizializzazione"); InitializeObject = InitializeEmptyObject;)) ResetInitializeObject ( );

La funzione InitializeObject è una variabile che viene assegnata una funzione di implementazione nel contesto ResetInitializeObject. Mostra 2-4 ricetta che non c'è alcuna differenza nel modo in cui si dichiara una funzione, anche se sembra strano o fuori luogo. Per inizializzare InitializeObject, la funzione ResetInitializeObject si chiama, creando in tal modo la funzione InitializeObject. InitializeObject E quando sarà chiamato riassegnare ad una funzione vuota.

Chiamando ResetInitializeObject azzera di nuovo l'inizializzazione, permettendo InitializeObject per inizializzare lo stato e la risistemazione di nuovo se stesso. Da questo esempio, si può vedere che una decisione non ha bisogno di essere implementato usando un'istruzione if. Un altro esempio che illustra come un motore di Stato potrebbe essere attuata segue. L'esempio implementa un interruttore della luce, dove se la luce è accesa, si è spento, e viceversa. Si noti che non una singola istruzione if viene usato in questo esempio.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html funzione ToggleLight () (ToggleLight.on = function () (ToggleLight.curr = ToggleLight.off; ritorno "on";) ToggleLight.off = function () (ToggleLight.curr = ToggleLight.on; return "off";) try (return ToggleLight.curr ();) catch (e) (info ( "ToggleLight", "..."); ToggleLight.on inizializzazione return ();))

ToggleLight la funzione viene chiamata ogni volta che si desidera passare la luce acceso o spento. Non vi è alcun parametro per indicare uno o uno sconto, la funzionalità è integrata all'interno della funzione ToogleLight. Per l'attuazione ToggleLight ci sono due proprietà, dentro e fuori, che sono entrambi funzioni. Il sulla funzione assegna la proprietà curr di off e restituisce una "a" buffer. La funzione off assegna la proprietà curr di off e restituisce un "off" buffer.

Per alternare lo stato, la proprietà curr che è definita come una funzione viene richiamata. La convocazione di valuta è incorporato in un blocco di eccezioni, perché curr non sarà inizializzato ToggleLight la prima volta che viene chiamato. Così, viene generata un'eccezione, e nella parte di cattura del blocco eccezione, la materia di proprietà (che è una funzione) è chiamato. Invitando assegna automaticamente curr e inizializza lo stato. E 'importante ricordare che utilizzando un blocco di eccezioni e invitando è accettabile, perché è uno strumento di attuazione di inizializzazione pigra. Durante la scrittura di blocchi di decisione e di funzioni, pensate di Stato e le seguenti aspetti di questa ricetta:

• Il programma non ha bisogno di comprendere come molte decisioni, perché le decisioni sono state sostituite da diversi stati.

• È possibile riassegnare le funzioni, se è possibile suddividere il problema in un problema al motore di Stato.

• Si può essere più flessibile, con funzioni di riassegnato perché il comportamento può essere sostituita in modo dinamico. Ad esempio, se avete bisogno di uno-due di inizializzazione stadio con una decisione, il che significa ulteriori dichiarazioni, se alterato in una posizione centrale del codice sorgente. Utilizza una funzione riassegnati, si sta creando un motore di Stato in cui il comportamento può essere modificato durante l'esecuzione a livello locale.

• Quando si legge attraverso esempi di questa ricetta, potrebbe aver pensato: "Perché non utilizzare una classe e l'oggetto?" La risposta è che una funzione è un oggetto e gli esempi sono la programmazione object-oriented. Il codice sembra strano perché di solito assume una funzione è una funzionalità utilizzata per creare una classe, e che le classi in genere non sono funzioni. Se il fastidio notazione voi, il mio consiglio è di lasciare che questa caratteristica con lo stufato di JavaScript nella tua mente per un po '. Vi sarà sicuramente venuto a vedere che è un potente strumento di programmazione.

Nota Per un altro esempio di utilizzo di ricorsione invece di utilizzare i blocchi decisione.

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: In questo articolo utilizzando le funzioni di inizializzazione e prendere decisioni JavaScript "è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 312 users browsing the articles directory