2012-07-26 24 views
6

me da la idea básica acerca de this no estar en un method cuando en strict mode esbozado here, pero se pone un poco erudita, para ser honesto. Así términos, en más prosaicos:jQuery devolución de llamada - estricta violación

que tienen un controlador de este modo:

$('.myClass').one('keyup', function() { 
    var $this = $(this); 
    etc etc 
}); 

quiero cambiar a esto:

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 

no le gusta porque en strict mode porque Estoy usando this fuera de un método. Lo entiendo.

Sin embargo, tengo que tener myFunction separada al controlador, porque (1) se une a diversas clases/elementos y (2) Estoy usando .off().one('keyup', myFunction) para restablecer el manejador one para diversas clases en varios puntos.

Entonces, ¿cómo puedo obtener una función de devolución de llamada por separado sin violar el negocio this?

+0

La respuesta aceptada a la pregunta el enlace a sugiere reemplazar la declaración de función con una expresión de función. ¿Lo intentaste? –

+0

No use el modo estricto – Imdad

+0

No hay nada de malo en usar esto dentro de una función. Dado que los "métodos" realmente no pertenecen a los objetos (son solo propiedades que se refieren a funciones definidas _en algún lugar_, y posiblemente compartidas con otros objetos). No veo cuál es la objeción. – nnnnnn

Respuesta

6

tengo la idea básica de este no estar en un método en el modo estricto ...

Sí, pero estás confundiendo dos cosas no relacionadas: el modo estricto, y JSLint. En gran medida no están relacionados (excepto que JSLint tiene una opción para requerir el modo estricto).

No hay problema con su código en modo estricto. Es perfectamente válido y apropiado (debido a cómo jQuery usa this). Example Hay no "violación estricta" allí.

A JSLint no le gusta, pero a JSLint no le gustan muchas cosas que son perfectamente válidas y apropiadas. JSLint detecta una combinación de cosas que son ampliamente reconocidas como problemas (como faltan puntos y comas), y cosas que a Douglas Crockford no le gustan desde una perspectiva de estilo. Crockford es inteligente y está bien informado, pero no todos están de acuerdo con sus elecciones de estilo.

Las herramientas de pelusa son muy útiles, una parte esencial del juego de herramientas. JSLint es menos útil de lo que podría ser (en mi opinión), al combinar problemas de sustancia con problemas de estilo (aunque se admite que es una línea muy fina, con JavaScript). Puede considerar usar JSHint, un tenedor que le da más control sobre lo que verifica.

+0

Esto es realmente útil. Utilizo el JSLint incorporado de Aptana, y el error "violación estricta" sonó tan ... autoritario :) – Nick

+0

@Nick: ¡Ack! De hecho, no me di cuenta de que estaba redactado así (pero un chequeo rápido en jslint.com lo confirma). Classic Crockford ... :-) –

1

¿No puede usar el objeto de evento en su lugar?

i.e.

function myFunction (e) { 
    var $this = $(e.currentTarget); 
}; 

Ejemplo: http://jsfiddle.net/gRoberts/cRnb3/

+0

No siempre, dice jQuery documentos: 'event.target' indica el elemento más profundo (más interno) donde ocurrió el evento, por lo tanto' this' puede no ser igual a 'event.target' si el evento ha burbujeado desde un elemento descendiente. –

0

se podía leer la currentTarget de la cubeta pasado evento a objetos, como:

function myFunction (event) { 
    var $this = $(event.currentTarget); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 
0

Prueba este

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
var obj= $('.myClass1'); 
obj.myFunction =myFunction ; 

obj.one('keyup', myFunction); 
obj.one('keyup', myFunction); etc 
Cuestiones relacionadas