2012-03-08 18 views
30

Estoy aprendiendo JavaScript en este momento y no entiendo muy bien cuándo escribir una función en una variable.¿Cuándo debería almacenar una función en una variable?

Por ejemplo, ambos de los siguientes bloques de código hacen exactamente lo mismo en Node.js:

var onReq = function(req, res) { 
    res.write('Hello'); 
}; 

http.createServer(onReq).listen(3000); 

y

function onReq(req, res) { 
    res.write('Hello'); 
} 

http.createServer(onReq).listen(3000); 



¿Cuál es el mejor método para hacer conforme a mejor prácticas, y por qué?

+0

para esta pregunta necesita más concentración en variables de cadena y variables enteras y flotantes; –

+0

http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip – jbabey

+0

duplicado: http://stackoverflow.com/questions/336859/javascript-var-function-function-function-function-functionname –

Respuesta

18

Normalmente solo usaré un var funcName = function(){} cuando necesite redefinir la (s) acción (es) para esa función más adelante. Por ejemplo:

var foo = function(a){ return a * 2; } 
var bar = foo(2); 

foo = function(a){ return a/2; } 

bar = foo(bar); 

De lo contrario, para la mayoría de propósitos (suponiendo que no es una devolución de llamada o un modificador) declarar una función "clásica" es por lo general aceptable.

+0

Veo lo que quiere decir, pero aún es mejor hacer el método anterior de declarar la función que he indicado ¿verdad? – imjp

1

De acuerdo con el artículo JavaScript as a First Language de John Resig, su primer bloque de código se considera una buena práctica.

+4

No se deje influenciar demasiado por eso. Hay muchas ocasiones en las que es mucho más conveniente utilizar una declaración de función y aprovechar el hecho de que está al principio de tu código. Es triste que sugiera '// No hagas esto: function getData() {}' porque facilita enseñar funciones como un objeto. Facilitar la enseñanza es una mala razón para comenzar a los principiantes con la idea de que hay algo mal con eso. –

3

Aquí es una explicación:

Hay una distinción entre el nombre de la función y la variable de la función se asigna a:

  • El nombre de la función no se puede cambiar, mientras que la variable se le asigna la función de a puede ser reasignado.
  • El nombre de la función solo se puede usar dentro del cuerpo de la función. Intentar utilizarlo fuera del cuerpo de la función da como resultado un error (o indefinido si el nombre de la función se declaró previamente mediante una instrucción var).

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

+0

Solo una adición rápida. El nombre de la función en una declaración fn (como MDN usa el término) se puede cambiar; simplemente, asígnelo a una nueva variable para obtener otra referencia a la función. El nombre de la función también puede ser reasignado a otra función (o algo completamente diferente) más adelante en el código. Otra diferencia es que una declaración de función elevará la asignación a la parte superior del alcance, mientras que el uso de una variable solo elevará la declaración de la variable. – meloncholy

+0

Ninguno de sus puntos parece correcto. Para el primero es un poco difícil ver lo que dices, pero en ambos casos la variable que hace referencia a la función puede ser reasignada. Y el segundo punto no es correcto. El nombre de la función se puede usar fuera del cuerpo de la función como se muestra en la pregunta. Estás pensando en una expresión de función nombrada, que no se muestra en la pregunta. –

+0

A través de uno de los enlaces duplicados de arriba, kangax's [expresiones de funciones nombradas desmitificadas] (http://kangax.github.com/nfe/) cubre esto con mucho más detalle y con mucha más sutileza (por ejemplo, señaló que mi comentario en el comportamiento de elevación realmente puede variar entre los navegadores). Definitivamente vale la pena echarle un vistazo. – meloncholy

10

yo descuido a la versión no variable function onReq(){}. No es una decisión consciente que haya tomado, pero al pensar en ello surgen estos argumentos:

  • Parece más limpio.
  • Es conceptualmente más simple: es solo una función, mientras que la otra es una función y una variable. Es algo pequeño, pero me parece valioso, no obstante.
  • Me asegura que onReq siempre se referirá a que el cuerpo de la función - una cosa menos a considerar al leer el código. Algo así como marcar una variable como final en Java.
  • Me impide "accidentalmente" reemplazar la función, causando efectos secundarios involuntarios en otros lugares.
1

yo personalmente he encontrado ciertos problemas con llamadas a funciones locales (funciones declaradas dentro de otras funciones) cuando se utiliza la sintaxis no variable en algunas versiones de IE (lo más probable IE8 o inferior), mientras que la sintaxis de la variable funcionó como se esperaba.

Dado que las funciones no se deben desclasificar en el espacio de nombre global, la mayoría de las funciones son locales y, por lo tanto, tiene sentido utilizar la sintaxis de las variables para las funciones siempre.

0

Veo algunas opiniones diferentes aquí, pero la mayoría de ellas están más basadas en lo que piensas que es mejor o no, pero no veo las razones técnicas sobre cuándo usar una u otra, pero de seguro hay técnicas restricciones o ventajas en uso una fórmula de declaración u otra. Realmente soy un principiante con javascript y no estoy seguro de aconsejarlo, pero propondré un caso en el que almacenar una función en una variable no sea funcional.

En el siguiente código, al definir un filtro angular, si defino la función dentro de una variable, no puedo llamarlo con éxito desde el método de filtro. ¿Alguien podría explicarme la razón técnica sobre esto?

ver el código (comentado no está funcionando):

angular 
    .module('loc8rApp') 
    .filter('formatDistance', formatDistance); 

function formatDistance(){ 
     return function (distance) { 
     var numDistance, unit; 
     if (distance && _isNumeric(distance)) { 
     if (distance > 1) { 
      numDistance = parseFloat(distance).toFixed(1); 
      unit = 'km'; 
      } else { 
      numDistance = parseInt(distance * 1000,10); 
      unit = 'm'; 
      } 
      return numDistance + unit; 
     } else { 
      return "?"; 
     } 
     }; 
}; 

var _isNumeric = function (n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
}; 

/* 
var formatDistance = function() { 
    return function (distance) { 
    var numDistance, unit; 
    if (distance && _isNumeric(distance)) { 
     if (distance > 1) { 
     numDistance = parseFloat(distance).toFixed(1); 
     unit = 'km'; 
     } else { 
     numDistance = parseInt(distance * 1000,10); 
     unit = 'm'; 
     } 
     return numDistance + unit; 
    } else { 
     return "?"; 
    } 
    }; 
}; 
*/ 

gracias de antemano!

Cuestiones relacionadas