2012-07-02 15 views
19

Estoy buscando una buena técnica para alejarme de lo que estoy tentado de hacer: establecer una variable global.Cómo determinar si se ha llamado a una función sin establecer la variable global

La primera vez que alguien ejecuta una función haciendo clic en un botón, desencadena una función inicial para convertir algunas cosas en juegos de arrastre. Más tarde, si presionan el botón por segunda vez, quiero determinar si la función init se ha inicializado, y si es así, no volver a llamar. Podría hacer esto fácilmente estableciendo una variable global desde la función init y luego verificando esa variable desde la función de hacer clic, pero me pregunto cómo hacer esto sin establecer una variable global. Realmente me gustaría un ejemplo de una forma de hacer esto.

Respuesta

21

Se podría añadir un alojamiento a la función:

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

init(); 

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

¿Por qué no acaba de comprobar para ver si sus draggables tienen una clase de draggable en ellos?

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

Gracias a este Jason! terminó usando a! símbolo para comprobar si aún no era arrastrable pero básicamente la solución que necesitaba. – codelove

+1

yup, no hay problema. entonces, si esto es lo que usaste, ¿por qué no lo elegiste como aceptado? : D – Jason

+0

¡Intenté usarlo con a! pero por alguna razón siempre se registraba como no arrastrable ... así que opté por la solución de Levi ... ¡Lo siento, había tantos métodos para elegir! lol – codelove

15

Mientras que la respuesta de @Levi's debería funcionar bien, me gustaría presentar otra opción. Sobreescribir la función init para no hacer nada una vez que ha sido llamada.

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

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

La función cuando se llama por primera vez hará el inicio. Luego se sobrescribirá inmediatamente para devolver falso la próxima vez que se llame. La segunda vez que se llama a la función, el cuerpo de la función solo contendrá el resultado falso.

Para más lectura: http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/

+0

Esto es inteligente, aunque usaré la respuesta de Jason para simplificar Definitivamente usaré esta técnica en el futuro – codelove

+0

esta es una técnica muy buena – Jason

1

Lo que podría hacer es desenganchar la función init del 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(); 

La primera if será cierto e imprimir exists! pero ya que la función remueve a sí mismo, el segundo if se producirá un error. En mi ejemplo, yo llamo el segundo init incondicionalmente sólo para demostrar que no pasará nada, pero por supuesto que se podría llamar sólo si existe:

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

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

+0

¡guau hay muchas soluciones para esta tarea! es difícil determinar qué ruta tomar, lol – codelove

+0

Hay muchas soluciones de calidad. Vale la pena señalar en el mío que 'init' es incapaz de ser llamado nuevamente.Muchos de estos otros requieren que se verifique alguna variable y, si no la revisas, puedes llamarla. –

2
Function.prototype.fired = false; 

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

console.log(myfunc.fired) // false 

myfunc(); 

console.log(myfunc.fired) // true 
Cuestiones relacionadas