He estado experimentando con ES6 durante un tiempo y acabo de encontrar un pequeño problema.
Realmente me gusta usar las funciones de flecha, y siempre que puedo, las uso.
Sin embargo, ¡parece que no puedes atarlos!
Aquí está la función:
var f = () => console.log(this);
Aquí está el objeto al que quiero vincular la función:
var o = {'a': 42};
Y así es como me uniría f
a o
:
var fBound = f.bind(o);
Y luego solo puedo llamar fBound
:
fBound();
Lo que generará esto (el o
objeto):
{'a': 42}
¡Frio! ¡Encantador! Excepto que no funciona. En lugar de generar el o
objeto, genera el window
objeto.
Entonces me gustaría saber: ¿puedes unir las funciones de flecha? (Y si es así, ¿cómo?)
He probado el código anterior en Google Chrome 48 y Firefox 43, y el resultado es el mismo.
javascript
function
ecmascript-6
Florrie
fuente
fuente
this
de su ámbito principal.Respuestas:
No puede volver
this
a vincular en una función de flecha. Siempre se definirá como el contexto en el que se definió. Si necesitathis
ser significativo, debe usar una función normal.De la especificación ECMAScript 2015 :
fuente
this
. Los dos están relacionados, pero no son lo mismo.this
dentro de una función de flecha siempre 'hereda' elthis
del ámbito de inclusión. Esa es una característica de las funciones de flecha. Pero aún puedebind
todos los demás parámetros de una función de flecha. Solo que nothis
.Para completar, puede volver a vincular las funciones de flecha, simplemente no puede cambiar el significado de
this
.bind
todavía tiene valor para argumentos de función:Pruébelo aquí: http://jsbin.com/motihanopi/edit?js,console
fuente
this
(que, por supuesto, se define léxicamente)?Desde el MDN :
Esto significa que no puede vincular un valor que
this
le guste.fuente
Durante años, los desarrolladores de js lucharon con el enlace de contexto, preguntaron por qué
this
cambió en javascript, tanta confusión a lo largo de los años debido al enlace de contexto y la diferencia entre el significado dethis
en javascript ythis
en la mayoría de los otros lenguajes OOP.¡Todo esto me lleva a preguntar, por qué, por qué! ¿Por qué no quieres volver a vincular una función de flecha? Aquellos en los que especialmente creado para resolver todos estos problemas y confusiones y evitar tener que utilizar
bind
ocall
o cualquier otra forma de preservar el ámbito de la función.TL; DR
No, no puede volver a vincular las funciones de flecha.
fuente
this
no es funcional. Las lambdas deberían serarguments => output
. Si necesita algún contexto externo, páselo. La existencia misma dethis
es lo que facilitó todo el calce de los patrones OO en el lenguaje. Nunca habrías escuchado el término "clase javascript" sin él.this
.No puede usar
bind
para cambiar el valor dethis
dentro de una función de flecha. Sin embargo, puede crear una nueva función regular que haga lo mismo que la función de flecha anterior y luego usarcall
obind
volver a enlazarthis
como de costumbre.Usamos una
eval
llamada aquí para recrear la función de flecha que pasas como una función normal y luego usamoscall
para invocarla con un diferentethis
:fuente
¿Las funciones de flecha ES6 realmente resuelven "esto" en JavaScript
El enlace anterior explica que las funciones de flecha
this
no cambian con lasbind, call, apply
funciones.Se explica con un muy buen ejemplo.
ejecuta esto
node v4
para ver el comportamiento "esperado",fuente
Hice la misma pregunta hace un par de días.
No puede enlazar un valor ya que el
this
ya está enlazado.Enlace diferente de este ámbito a ES6 => operador de función
fuente
this
está enlazado " - En las funciones regulares también está enlazado. El punto es que en las funciones de flecha no tiene enlace local .Corto, NO PUEDES enlazar funciones de flecha, pero siga leyendo:
Imagine que tiene esta función de flecha debajo que se imprime
this
en la consola:Entonces, la solución rápida para esto sería usar la función normal, así que cámbielo a:
Luego puede vincularlo a cualquier entorno léxico usando
bind
ocall
oapply
:y llamarlo en caso de
bind
.También hay formas de usar
eval()
para hacerlo, lo que no es muy recomendable .fuente
function myFunc
es conductualmente diferente en formas además de ser vinculable; una aproximación más exacta seríaconst myFunc = function() {...}
. También tengo curiosidad por lo que quieres decir con evaluar, ya que ese es un enfoque que no creo que haya compartido ninguna respuesta aquí antes; sería interesante ver cómo se hace y luego leer por qué está tan desaconsejado.Tal vez este ejemplo te ayude:
fuente