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.
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
onew.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
onew.target
. Cualquier referencia aarguments
,super
,this
onew.target
dentro de ArrowFunction debe resolverse en un enlace en un entorno de encierro léxico. Normalmente, este será elFunction Environment
deFunction Environment
de una función que lo encierra de inmediato.