Accesso alle variabili da altre funzioni senza utilizzare variabili globali

Ho sentito da una varietà di luoghi che le variabili globali sono intrinsecamente cattive e cattive, ma quando faccio qualche Javascript non orientato agli oggetti, non riesco a vedere come evitarli. Diciamo che ho una funzione che genera un numero usando un algoritmo complesso usando numeri casuali e roba, ma ho bisogno di continuare a usare quel particolare numero in qualche altra funzione che è un callback o qualcosa e quindi non può essere parte della stessa funzione.

Se il numero generato originariamente è una variabile locale, non sarà accessibile da lì. Se le funzioni fossero metodi object, potrei rendere il numero una proprietà ma non lo sono e sembra piuttosto complicato modificare l’intera struttura del programma per farlo. Una variabile globale è davvero così ctriggers?

Per rendere una variabile calcasting nella funzione A visibile nella funzione B, hai tre possibilità:

  • renderlo globale,
  • renderlo una proprietà dell’object, o
  • passalo come parametro quando chiami B da A.

Se il tuo programma è abbastanza piccolo, i globals non sono così male. Altrimenti considererei l’utilizzo del terzo metodo:

function A() { var rand_num = calculate_random_number(); B(rand_num); } function B(r) { use_rand_num(r); } 

Penso che la soluzione migliore qui potrebbe essere quella di definire una singola variabile globale e di eseguire il dumping delle variabili lì:

 var MyApp = {}; // Globally scoped object function foo(){ MyApp.color = 'green'; } function bar(){ alert(MyApp.color); // Alerts 'green' } 

Nessuno dovrebbe urlarvi per aver fatto qualcosa di simile a quanto sopra.

Prendi in considerazione l’uso degli spazi dei nomi:

 (function() { var local_var = 'foo'; global_var = 'bar'; // this.global_var and window.global_var also work function local_function() {} global_function = function() {}; })(); 

Sia local_function che global_function hanno accesso a tutte le variabili locali e globali.

Modifica : un altro modello comune:

 var ns = (function() { // local stuff function foo() {} function bar() {} function baz() {} // this one stays invisible // stuff visible in namespace object return { foo : foo, bar : bar }; })(); 

Le proprietà return ed ora sono ora accessibili tramite l’object namespace, ad esempio ns.foo , pur mantenendo l’accesso alle definizioni locali.

Quello che stai cercando è tecnicamente noto come currying.

 function getMyCallback(randomValue) { return function(otherParam) { return randomValue * otherParam //or whatever it is you are doing. } } var myCallback = getMyCallBack(getRand()) alert(myCallBack(1)); alert(myCallBack(2)); 

Quanto sopra non è esattamente una funzione al curry ma raggiunge il risultato di mantenere un valore esistente senza aggiungere variabili allo spazio dei nomi globale o richiedendo un altro repository di oggetti per questo.

Se un’altra funzione ha bisogno di usare una variabile, la si passa alla funzione come argomento.

Anche le variabili globali non sono intrinsecamente cattive e cattive. Finché vengono utilizzati correttamente, non c’è alcun problema con loro.

Un altro approccio è quello che ho raccolto da un post sul forum di Douglas Crockford ( http://bytes.com/topic/javascript/answers/512361-array-objects ). Ecco qui…

Douglas Crockford ha scritto:

15 luglio 2006

“Se vuoi recuperare oggetti con id, dovresti usare un object, non un array. Poiché anche le funzioni sono oggetti, puoi memorizzare i membri nella funzione stessa.”

 function objFacility(id, name, adr, city, state, zip) { return objFacility[id] = { id: id, name: name, adr: adr, city: city, state: state, zip: zip } } objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010); 

“L’object può essere ottenuto con”

 objFacility.wlevine 

Le proprietà degli oggetti sono ora accessibili da qualsiasi altra funzione.

Ho trovato questo estremamente utile in relazione alla domanda originale:

Restituisce il valore che si desidera utilizzare in functionOne, quindi chiama functionOne all’interno di functionTwo, quindi colloca il risultato in una nuova var e fa riferimento a questa nuova var all’interno di functionTwo. Questo dovrebbe consentire di utilizzare la var dichiarata in functionOne, all’interno di functionTwo.

 function functionOne() { var variableThree = 3; return variableThree; } function functionTwo() { var variableOne = 1; var var3 = functionOne(); var result = var3 - variableOne; console.log(variableOne); console.log(var3); console.log('functional result: ' + result); } functionTwo(); 

Se c’è una possibilità che riutilizzerai questo codice, probabilmente farei lo sforzo di andare con una prospettiva orientata agli oggetti. L’uso dello spazio dei nomi globale può essere pericoloso: si corre il rischio di trovare errori a causa dei nomi delle variabili che vengono riutilizzati. Tipicamente comincio ad usare un approccio orientato agli oggetti per qualcosa di più di una semplice callback in modo che non debba fare la cosa di riscrittura. Ogni volta che hai un gruppo di funzioni correlate in javascript, penso, è un candidato per un approccio orientato agli oggetti.

Non conosco le specifiche del problema, ma se la funzione ha bisogno del valore, può essere un parametro passato attraverso la chiamata.

I globals sono considerati pessimi perché lo stato globale e più modificatori possono creare codice difficile da seguire e strani errori. Per molti attori che armeggiano con qualcosa può creare il caos.

Puoi controllare completamente l’esecuzione delle funzioni javascript (e passare le variabili tra di esse) usando eventi personalizzati di jQuery …. Mi è stato detto che non era ansible su tutti questi forum, ma ho ottenuto qualcosa che funziona esattamente (anche usando una chiamata Ajax).

Ecco la risposta (IMPORTANTE: non è la risposta verificata ma piuttosto la risposta da parte mia “Emile”):

Come ottenere una variabile restituita attraverso più funzioni – Javascript / jQuery