2008-11-28 22 views
10

Tengo un controlador onclick para un elemento <a> (en realidad, es un controlador creado por jQuery, pero eso no es importante). Se ve así:Función de llamada con "esto"

function handleOnClick() { 
    if(confirm("Are you sure?")) { 
     return handleOnClickConfirmed(); 
    } 
    return false; 
} 

De esta función, el objeto este es accesible como el < un elemento > clic. Sin embargo, handleOnClickConfirmed's este es un elemento de ventana! Quiero que handleOnClickConfirmed tenga el mismo este que handleOnClick. ¿Cómo haría esto?

(Sé que puedo pasar este como argumento para handleOnClickConfirmed, pero algunos de mi código ya utiliza handleOnClickConfirmed y no quieren tener que volver a escribir esas llamadas. Además, creo que el uso de este se ve más limpio .)

Respuesta

26

El siguiente debería hacerlo:

function handleOnClick() { 
    if(confirm("Sure?")) { 
     return handleOnClickConfirmed.call(this); 
    } 
    return false; 
} 

La función call() unido a Function objetos está diseñado para permitir esto; llamando a una función con un contexto deseado. Es un truco extremadamente útil al configurar manejadores de eventos que vuelven a llamar a funciones dentro de otros objetos.

+0

Muchas gracias. =] Estaba pensando en algún tipo de esto. Llamada (fn), pero creo que conseguí cambiar el orden. – strager

10

respuesta de Rob es la mejor respuesta para su problema, pero yo quería hacer frente a algo que usted escribió en su pregunta original:

I know I can pass this as an argument to handleOnClickConfirmed, but some of my code already uses handleOnClickConfirmed and I don't want to have to rewrite those calls.

parámetros de JavaScript siempre son opcionales, por lo que el intérprete se refiere. Por ejemplo, si usted tiene la función de:

function MyFunction(paramA, paraB) { 
    // do nothing 
} 

Todas estas llamadas se ejecutarán sin errores:

MyFunction(1,2); 
MyFunction(1); 
MyFunction(); 

por lo que podría modificar handleOnClickConfirmed a aceptar lo que sería esencialmente un parámetro opcional. De la misma manera:

function handleOnClickConfirmed(context) { 
    context = context || this; 
    // use context instead of 'this' through the rest of your code 
} 

Nuevamente, en este caso particular, la función de llamada es la mejor solución. Pero la técnica que describí anteriormente es buena para tener en tu caja de herramientas.

Cuestiones relacionadas