2012-07-02 12 views
19

Sto cercando una buona tecnica per allontanarmi da ciò che sono tentato di fare: impostare una variabile globale.Come determinare se una funzione è stata chiamata senza impostare la variabile globale

La prima volta che qualcuno esegue una funzione facendo clic su un pulsante attiva una funzione iniziale per trasformare alcune cose in oggetti trascinabili. Successivamente, se fanno clic sul pulsante una seconda volta, voglio determinare se la funzione init è stata inizializzata e in tal caso non richiamarla più. Potrei facilmente farlo impostando una variabile globale dalla funzione init e poi controllando quella variabile dalla funzione click, ma mi chiedo come fare senza impostare una variabile globale. Mi piacerebbe davvero un esempio di come farlo.

risposta

21

Si potrebbe aggiungere una proprietà alla funzione:

function init() { 
    init.called = true; 
} 

init(); 

if(init.called) { 
    //stuff 
} 
2

Perché non basta controllare per vedere se le draggables hanno una classe di draggable su di loro?

if ($('.mydiv').is('.draggable')) { 
    //do something 
} 
+0

Grazie per questo Jason! finito per usare un! simbolo per verificare se non era ancora trascinabile ma fondamentalmente la soluzione di cui avevo bisogno. – codelove

+1

sì, nessun problema. quindi se questo è quello che hai usato, perché non lo hai scelto come accettato? : D – Jason

+0

Ho provato ad usarlo con a! ma per qualche ragione è stato sempre registrato come non trascinabile ... quindi è andata per la soluzione di Levi .. Scusa, c'erano tanti metodi tra cui scegliere! lol – codelove

15

Mentre la risposta di @Levi dovrebbe funzionare bene, vorrei presentare un'altra opzione. Scriverebbe la funzione init per non fare nulla una volta che è stato chiamato.

var init = function() { 
    // do the initializing 

    init = function() { 
     return false; 
    } 
}; 

La funzione quando chiamata la prima volta farà l'init. Quindi si sovrascriverà immediatamente per restituire false alla successiva chiamata. La seconda volta che viene chiamata la funzione, il corpo della funzione conterrà solo return false.

Per ulteriori lettura: http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/

+0

Questo è intelligente, mentre userò la risposta di Jason per semplicità userò sicuramente questa tecnica in futuro – codelove

+0

questa è una tecnica piuttosto interessante – Jason

1

Che cosa si potrebbe fare è sganciare la funzione init dal prototipo.

​var Obj = function() { 
    this.init = function() { 
     document.write("init called<br/>"); 
     this.init = null; 
    } 
} 
var o = new Obj(); 
if (o.init) document.write("exists!<br/>"); 
o.init(); 
if (o.init) document.write("exists!<br/>"); 
o.init(); 

Il primo if sarà vero e stampare exists! ma dal momento che la funzione stessa rimuove, non riuscirà il secondo if. Nel mio esempio, che io chiamo il secondo init incondizionatamente solo per dimostrare che non accadrà nulla, ma naturalmente si potrebbe chiamare solo se esiste:

if (o.init) o.init(); 

http://jsfiddle.net/coreyog/Wd3Q2/

+0

wow ci sono un sacco di soluzioni per questo compito! è difficile determinare quale strada prendere, lol – codelove

+0

Ci sono molte soluzioni di qualità. Vale la pena di notare nel mio che 'init' è incapace di essere chiamato di nuovo.Molti di questi altri richiedono che alcune variabili siano controllate e se non le controlli, puoi comunque chiamarle. –

2
Function.prototype.fired = false; 

function myfunc() { 
    myfunc.fired = true; 
    // your stuff 
}; 

console.log(myfunc.fired) // false 

myfunc(); 

console.log(myfunc.fired) // true 
Problemi correlati