Tengo una función que estoy tratando de convertir a la nueva sintaxis de flecha en ES6 . Es una función con nombre:
function sayHello(name) {
console.log(name + ' says hello');
}
¿Hay alguna manera de darle un nombre sin una declaración var:
var sayHello = (name) => {
console.log(name + ' says hello');
}
Obviamente, solo puedo usar esta función después de haberla definido. Algo como lo siguiente:
sayHello = (name) => {
console.log(name + ' says hello');
}
¿Hay una nueva forma de hacer esto en ES6 ?
Respuestas:
Lo hace de la manera que descartó en su pregunta: lo coloca en el lado derecho de una asignación o inicializador de propiedad donde el motor de JavaScript puede usar razonablemente la variable o el nombre de la propiedad como nombre. No hay otra forma de hacerlo, pero hacerlo es correcto y está completamente cubierto por la especificación.
Por especificación, esta función tiene un nombre verdadero
sayHello
:Esto se define en Operadores de asignación> Semántica de tiempo de ejecución: evaluación donde llama a la
SetFunctionName
operación abstracta (esa llamada se encuentra actualmente en el paso 1.e.iii).De manera similar, Runtime Semantics: PropertyDefinitionEvaluation llama
SetFunctionName
y, por lo tanto, le da a esta función un nombre verdadero:Los motores modernos ya establecen el nombre interno de la función para declaraciones como esa; Edge todavía tiene el bit que lo hace disponible como
name
en la instancia de la función detrás de un indicador de tiempo de ejecución.Por ejemplo, en Chrome o Firefox, abra la consola web y luego ejecute este fragmento:
En Chrome 51 y superior y Firefox 53 y superior (y Edge 13 y superior con una marca experimental), cuando ejecute eso, verá:
Tenga en cuenta la
foo.name is: foo
yError...at foo
.En Chrome 50 y versiones anteriores, Firefox 52 y versiones anteriores, y Edge sin la marca experimental, verás esto porque no tienen la
Function#name
propiedad (todavía):Tenga en cuenta que el nombre no se encuentra en
foo.name is:
, pero se muestra en el seguimiento de la pila. Es solo que realmente implementando laname
propiedad en la función era de menor prioridad que otras características de ES2015; Chrome y Firefox lo tienen ahora; Edge lo tiene detrás de una bandera, presumiblemente ya no estará detrás de la bandera por mucho tiempo.Correcto. No hay sintaxis de declaración de función para las funciones de flecha, solo la sintaxis de expresión de función , y no hay una flecha equivalente al nombre en una expresión de función con nombre de estilo antiguo (
var f = function foo() { };
). Entonces no hay equivalente a:Tienes que dividirlo en dos expresiones (argumentaría que deberías hacerlo de todos modos ) :
Por supuesto, si tiene que poner esto donde se requiere una sola expresión, siempre puede ... usar una función de flecha:
No digo que sea bonito, pero funciona si necesitas absolutamente un contenedor de expresión.
fuente
let f = () => { /* do something */ };
asigna un nombre a la función,let g = (() => () => { /* do something */ })();
no lo hace.o.foo = () => {};
no le da un nombre a la función. Esto fue intencional para evitar la fuga de información.No. La sintaxis de la flecha es una forma abreviada de funciones anónimas. Las funciones anónimas son, bueno, anónimas.
Las funciones con nombre se definen con la
function
palabra clave.fuente
SetFunctionName
.let a = () => {};
define una función con nombre (el nombre esa
) según la especificación y en los motores modernos (arroje un error para ver); simplemente no admiten laname
propiedad todavía (pero está en las especificaciones y llegarán allí eventualmente).Si por "nombre", quiere decir que desea
.name
establecer la propiedad de su función de flecha, tiene suerte.Si se define una función de flecha en el lado derecho de una expresión de asignación, el motor tomará el nombre en el lado izquierdo y lo usará para establecer la función de flecha
.name
, por ejemploHabiendo dicho eso, su pregunta parece ser más "¿puedo obtener una función de flecha para izar?". Me temo que la respuesta a esa pregunta es un gran "no".
fuente
name
propiedad en todos los lugares donde la especificación ES2015 lo requiere; ellos lo alcanzarán. Es una de las últimas cosas en la lista de cumplimiento de Chrome e incluso Chrome 50 no lo tiene (Chrome 51 finalmente lo tendrá). Detalles . Pero el OP descartó específicamente hacer esto (extrañamente).Parece que esto será posible con ES7: https://babeljs.io/blog/2015/06/07/react-on-es6-plus#arrow-functions
El ejemplo dado es:
Tenga en cuenta que para que esto funcione con babel, necesitaba habilitar la sintaxis más experimental de la etapa 0 de ES7. En mi archivo webpack.config.js actualicé el cargador de babel así:
fuente
this.handleOptionsButtonClick = this.handleOptionsButtonClick.bind(this);
constructor() { this.handleOptionsButtonClick = (e) => {…}; }
que es totalmente equivalente al código en tu respuesta, pero ya funciona en ES6. No es necesario usar.bind
.this
contexto"let a = () => {};
define una función de flecha con nombre llamadaa
. Detalles .En realidad, parece que una forma de nombrar las funciones de flecha (al menos a partir de Chrome 77 ...) es hacer esto:
fuente
fn('yourName', ()=>{})
, lo que podría mantener el 100% de flecha correcta semántica de función, o mejor aún, un plugin para babel "flecha sintaxis de la función denominada":fn yourName() => {}
. Cualquiera de estos se compilaría hasta el código anterior. Creo que las flechas con nombre serían tan BADA55para escribir una función de flecha con nombre, puedes usar el siguiente ejemplo, donde tengo una clase llamada LoginClass y dentro de esta clase escribí una flecha llamada función , llamada
successAuth
clase LoginClass {fuente
ESTO ES ES6
Sí, creo que lo que buscas es algo como esto:
fuente
Puede omitir la parte de la función y la parte de la flecha para crear funciones. Ejemplo:
fuente