tipos sintaxis globales funciones funcion flecha example javascript ecmascript-6 arrow-functions

javascript - globales - sintaxis funcion flecha



¿Las funciones de flecha de ES6 tienen sus propios argumentos o no? (4)

Las funciones de flecha no tienen su propio objeto de argumentos.

Las funciones de flecha no exponen un objeto de argumentos a su código: los arguments.length , arguments[0] , arguments[1] , etc., no se refieren a los argumentos proporcionados a la función de flecha cuando se llama.

Arrow_functions

Para este ejemplo

var b = function() { return () => console.log(arguments); }; b(1,2,3)(4,5,6);

la respuesta correcta debe ser [1, 2, 3]

Esta pregunta ya tiene una respuesta aquí:

No sé si las funciones de flecha enlazan arguments a un ámbito léxico o no.

Eche un vistazo a este ejemplo (el mismo concepto puede usarse para this ):

var b = function() { return () => console.log(arguments); }; b(1,2,3)(4,5,6); // different result of chrome vs FF.

Cuando ejecuto esto en Chrome, obtengo [1,2,3] , pero en Firefox, obtengo [4,5,6] . ¿Que esta pasando?


De la spec :

Cualquier referencia a arguments , super , this o new.target dentro de ArrowFunction debe resolverse en un enlace en un entorno de encierro léxico.

Por lo tanto, la respuesta correcta sería [1,2,3] . Firefox ha solucionado el problema en la versión 43 ( bug 889158 ).


Lo que está pasando es, de hecho, bastante simple. Chrome no parece agregar un objeto de arguments al alcance de la función interna (flecha), mientras que Firefox sí lo hace.

Esto significa que los argumentos registrados en Chrome son los argumentos pasados ​​a la función principal, que es una función "normal".

Firefox cree (y en mi opinión tienen razón) que las funciones de flecha también deberían tener el objeto de arguments , y por eso es que registran el segundo conjunto de números.

Como han dicho otros, lo que hace Firefox está en contra de la especificación.


No, las funciones de flecha no tienen sus propios arguments , this , super o new.target .

Vea la nota en spec :

Un ArrowFunction no define enlaces locales para arguments , super , this o new.target . Cualquier referencia a arguments , super , this o new.target dentro de ArrowFunction debe resolverse en un enlace en un entorno de encierro léxico. Normalmente, este será el Function Environment de Function Environment de una función que lo encierra de inmediato.