2012-04-13 18 views
5

¿Por qué jslint se queja por usar esto en una función declarada?Infracción estricta al usar 'this' en la función declarada, sin violación con la expresión de función

function navigate() { 
    var id = $(this).attr('id'); 
} 

me da:

#1 Strict violation. 
var id = $(this).attr('id'), // Line 18, Pos 20 

embargo JSLint da ninguna queja sobre: ​​

var navigate = function() { 
    var id = $(this).attr('id'); 
} 

yo los estoy usando tanto de la misma manera, y de que ambos trabajen correctamente en el navegador .

view.on('click', navigate); 

FYI, tengo alrededor de la advertencia utilizando event.target lugar, pero me gustaría saber qué es la distinción.

function navigate(event) { 
    var id = $(event.target).attr('id'); // no complaint 
} 
+0

Cuando pasé por JSLint no he tenido un error en 'this' tengo una error en 'evento' no utilizado. –

+0

Sí, me olvidé de eliminar el evento en las dos funciones principales, solo lo agregué para solucionar la queja sobre "esto". Pregunta actualizada, gracias –

Respuesta

3

Tener un vistazo a este enlace: https://github.com/shichuan/javascript-patterns/blob/master/general-patterns/function-declarations.html

A partir de este excelente referencia aquí: http://shichuan.github.com/javascript-patterns/

se proporcionan Estas razones, pero no estoy seguro de lo convincente que son:

  1. Hace que sea más fácil entender "funciones como un objeto".
  2. Impone buenos hábitos de punto y coma.
  3. No tiene mucho del equipaje tradicionalmente asociado con las funciones y el alcance.

Las razones para "expresión de función nombrada" en esa página son un poco más persuasivas, pero aún así no son abrumadoras.

Por cierto, los que parecen provenir de John Resig (jQuery de la fama), y ligados aquí: http://ejohn.org/blog/javascript-as-a-first-language/

+0

Interesante artículo de John Resig, gracias por el enlace. Sin embargo, no hay nada concreto allí, especialmente con respecto a "esto". Además, el método de declaración de función también tiene algunos beneficios: 1. No es necesario duplicar el nombre de la función (en la var en la parte superior del alcance y otra vez cuando la define) y 2. Nunca se encuentra con el problema de llamar la función antes de que se haya definido, ya que se eleva automáticamente a la parte superior del alcance actual. –

+0

# 2 es [totalmente] absurdo IMOHO. Tengo buenos hábitos de punto y coma. Incluye * sin incluir punto y coma espurios al final de cada línea *. La solución "correcta", una vez más IMOHO, es * nunca comenzar una línea con un '(' o '[' * ya que eso evitará el ASI de una línea previa sin un punto y coma (ver las innumerables publicaciones SO sobre el tema) –

+0

Marcando esto como correcto por ahora ... aún así es bastante vago. –

Cuestiones relacionadas