En otros lugares , ha surgido una discusión sobre la terminología de una función con nombre en CoffeeScript. En particular, alguien se refirió a algo como esto:
foo = ->
console.log("bar")
como una función con nombre. Pero se ha objetado que todo en CoffeeScript son funciones anónimas y no hay funciones con nombre. Esto es ciertamente cierto, CoffeeScript solo tiene expresiones de función que luego pueden almacenarse en una variable. Pero no creo que eso signifique que sea incorrecto llamar a esto una función con nombre.
Tal como lo veo, es una función con nombre porque es una función a la que se le ha dado un nombre. Es cierto que no es una función con nombre de la misma manera que otros lenguajes tienen funciones con nombre, pero creo que está lo suficientemente cerca como para que no sea inapropiado llamarla función con nombre. Insistir de otra manera solo parece ser una trampa.
¿Salgo a almorzar pensando que insistir en que esta no es una función nombrada es solo una tontería?
fuente
foo = ->
es una función antigua y simple, mientras queclass Foo
es un constructor. No veo ninguna razón por lafoo = ->
que se deba llamar estrictamente anónimo.Respuestas:
CoffeeScript está inexorablemente vinculado a JavaScript, y JavaScript diferencia entre las siguientes expresiones:
De hecho, incluso puedes escribir:
Como esta diferencia es importante en JavaScript, tiene sentido usar los mismos términos cuando se habla de CoffeeScript. Sin embargo, CoffeeScript no admite nada como la
function foo ()
sintaxis, por lo que podemos decir que no tiene funciones "con nombre".En cierto sentido, el nombre es parte de la definición de función en
function foo() { ... }
, donde en el otro caso simplemente crea una función y la asigna a una variable. Esto se refleja, por ejemplo, en laname
propiedad (no estándar) de las funciones: en el primer caso,foo.name
le dará"foo"
y en el segundo le dará""
.Además, en JavaScript, estos también difieren en términos de cómo se introducen en el alcance: la primera versión se "alza" y está disponible en todo su alcance donde la segunda definición solo está disponible después de que se asigna.
Básicamente, piense en ello como una jerga específica de JavaScript, que se transfiere a CoffeeScript porque CoffeeScript está muy relacionado con JS.
fuente
function foo () {}
. Sin embargo, aún puede inicializar una función con nombre a través de laclass
construcción. Solo que el CoffeeScript compilado (el JavaScript resultante) es mucho más detallado de cómo la mayoría escribiría una función con nombre.foo
el cuerpo de su función no será izado.class foo
cuerpo de la función de su no se elevará a la parte superior del archivo.Vale la pena señalar que el usuario declaró explícitamente que estaban convirtiendo una "función anónima en una función con nombre", ambos términos tienen un significado fuerte y existente y funcionalidades notablemente diferentes en el mundo de JavaScript. Dado el significado existente, no estaban haciendo tal cosa, y lo señalé.
CoffeeScript no está tan alejado de JavaScript que debería redefinir los términos que ambos comparten para que signifiquen algo más en un idioma. CoffeeScript no existe en alguna burbuja, eliminada de su implementación de JavaScript de la forma en que podría argumentar que C ++ está separado de Assembly. Conocer la diferencia entre una función anónima y una función con nombre es importante , porque si espera que su función CoffeeScript "con nombre" se comporte como una función con nombre real , se sentirá decepcionado:
El JavaScript equivalente funcionaría bien, con una función real con nombre:
Puede que tengas razón en que solo estoy "molestando", pero ¿y qué? Los puntos sutiles en la programación de computadoras son importantes , y ser "técnicamente" correcto es importante. Es la diferencia entre escribir código que funciona y comprender realmente por qué su código es correcto .
fuente
No. Después de todo, en términos de semántica, la referencia de su función se almacena en una variable, a la que puede hacer referencia mediante un nombre de variable .
fuente
Definitivamente no es ni un poco, imo. Lo uso ampliamente para facilitar la lectura:
Así:
Función real nombrada en "coffeescript"
Escapa de JS puro a través de la tecla de retroceso `
Tenga en cuenta que no puede sangrar en el cuerpo de su función.
Salud
fuente
No pierdas el tiempo discutiendo con pedantes. Nunca es fructífero. Sí, todos saben lo que quiere decir con una "función con nombre" en CoffeeScript, incluso si es técnicamente incorrecto. No, el uso de una terminología técnicamente incorrecta pero ampliamente entendida no tiene relación con la corrección o incorrección de la solución propuesta. ¿Es posible ser más preciso sin ganar alguna torpeza de fraseo? Probablemente no. Sin embargo, eso no significa que las personas lo dejarán pasar. Solo imagina a este tipo al otro lado de la conversación.
La razón por la que es técnicamente incorrecto es porque no ha nombrado la función, ha nombrado una referencia a la función. Considerar:
¿Cómo se llama la función?
foo
ybar
ambos hacen referencia a la misma función, pero tienen nombres diferentes. Además, cualquierafoo
obar
podría ser reasignado en cualquier momento para hacer referencia a una función diferente, o incluso a un tipo completamente diferente, sin cambiar la función en sí.fuente
Entonces, la forma en que leo esto es así:
Cuando declaras una función en una consola JavaScript usando
y luego invocar
foo
sin paréntesis, devuelveSin embargo, si lo define usando
y luego invocar de
foo
nuevo sin paréntesis, devuelveEn el primer caso, diría que está declarando una variable llamada "foo" que almacena una función anónima en ella. En el segundo caso, diría que en realidad estás declarando una función con nombre llamada "foo".
Debido a que CoffeeScript usa el primer patrón, estoy de acuerdo en que es técnicamente correcto que las funciones de CoffeeScript son todas funciones anónimas que se almacenan en variables con nombre.
fuente