Domanda

Ho sentito da una varietà di luoghi che le variabili globali sono intrinsecamente cattive e cattive, ma quando eseguo Javascript non orientato agli oggetti, non riesco a vedere come evitarle. Supponiamo che io abbia una funzione che genera un numero usando un algoritmo complesso usando numeri e cose casuali, ma devo continuare a usare quel particolare numero in qualche altra funzione che è un callback o qualcosa del genere e quindi non può far parte della stessa funzione.

Se il numero generato originariamente è una variabile locale, non sarà accessibile da lì. Se le funzioni fossero metodi a oggetti, potrei rendere il numero una proprietà ma non lo sono e sembra un po 'complicato cambiare l'intera struttura del programma per farlo. Una variabile globale è davvero così male?

È stato utile?

Soluzione

Per rendere una variabile calcolata nella funzione A visibile nella funzione B, sono disponibili tre opzioni:

  • rendilo globale,
  • rendilo una proprietà dell'oggetto o
  • passalo come parametro quando chiami B da A.

Se il tuo programma è abbastanza piccolo, i globi non sono poi così male. Altrimenti prenderei in considerazione l'utilizzo del terzo metodo:

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

function B(r)
{
    use_rand_num(r);
}

Altri suggerimenti

Penso che la tua scommessa migliore qui potrebbe essere quella di definire una singola variabile con ambito globale e scaricare le tue variabili lì:

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

Nessuno dovrebbe urlarti per aver fatto qualcosa del genere.

Valuta l'utilizzo 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
    };
})();

È ora possibile accedere alle proprietà return ed tramite l'oggetto dello spazio dei nomi, ad es. ns.foo , pur mantenendo l'accesso alle definizioni locali.

Quello che stai cercando è tecnicamente noto come curry.

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 curry ma ottiene il risultato di mantenere un valore esistente senza aggiungere variabili allo spazio dei nomi globale o richiedere un altro repository di oggetti per esso.

Se un'altra funzione deve utilizzare una variabile, la si passa alla funzione come argomento.

Anche le variabili globali non sono intrinsecamente cattive e cattive. Fintanto che vengono utilizzati correttamente, non vi è alcun problema.

Se c'è la 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: corri il rischio di trovare bug difficili a causa dei nomi delle variabili che vengono riutilizzati. In genere comincio usando un approccio orientato agli oggetti per qualcosa di più di un semplice callback in modo da non dover fare la riscrittura. Ogni volta che hai un gruppo di funzioni correlate in javascript, penso, sia un candidato per un approccio orientato agli oggetti.

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

Douglas Crockford ha scritto:

15 luglio 2006

" Se vuoi recuperare oggetti per id, allora dovresti usare un oggetto, non un array. Poiché le funzioni sono anche oggetti, è possibile memorizzare i membri in stessa funzione. "

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'oggetto 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 chiamare functionOne all'interno di functionTwo, quindi posizionare il risultato in una nuova var e fare riferimento a questa nuova var all'interno di functionTwo. Ciò dovrebbe consentire all'utente 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();

Non conosco i dettagli del problema, ma se la funzione necessita del valore, può essere un parametro passato attraverso la chiamata.

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

Puoi controllare completamente l'esecuzione delle funzioni javascript (e passare variabili tra loro) usando eventi jQuery personalizzati .... Mi è stato detto che questo non era possibile in tutti questi forum, ma ho qualcosa che funziona esattamente (anche usando una chiamata Ajax).

Ecco la risposta (IMPORTANTE: non è la risposta selezionata ma piuttosto la mia risposta "Emile"):

Come ottenere una variabile restituita funzioni multiple - Javascript / jQuery

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top