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 fa o:
var fBound = f.bind(o);
Y luego solo puedo llamar fBound:
fBound();
Lo que generará esto (el oobjeto):
{'a': 42}
¡Frio! ¡Encantador! Excepto que no funciona. En lugar de generar el oobjeto, genera el windowobjeto.
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

thisde su ámbito principal.Respuestas:
No puede volver
thisa vincular en una función de flecha. Siempre se definirá como el contexto en el que se definió. Si necesitathisser 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.thisdentro de una función de flecha siempre 'hereda' elthisdel ámbito de inclusión. Esa es una característica de las funciones de flecha. Pero aún puedebindtodos 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.bindtodaví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
thisle guste.fuente
Durante años, los desarrolladores de js lucharon con el enlace de contexto, preguntaron por qué
thiscambió en javascript, tanta confusión a lo largo de los años debido al enlace de contexto y la diferencia entre el significado dethisen javascript ythisen 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
bindocallo cualquier otra forma de preservar el ámbito de la función.TL; DR
No, no puede volver a vincular las funciones de flecha.
fuente
thisno es funcional. Las lambdas deberían serarguments => output. Si necesita algún contexto externo, páselo. La existencia misma dethises 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
bindpara cambiar el valor dethisdentro 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 usarcallobindvolver a enlazarthiscomo de costumbre.Usamos una
evalllamada aquí para recrear la función de flecha que pasas como una función normal y luego usamoscallpara invocarla con un diferentethis:fuente
¿Las funciones de flecha ES6 realmente resuelven "esto" en JavaScript
El enlace anterior explica que las funciones de flecha
thisno cambian con lasbind, call, applyfunciones.Se explica con un muy buen ejemplo.
ejecuta esto
node v4para ver el comportamiento "esperado",fuente
Hice la misma pregunta hace un par de días.
No puede enlazar un valor ya que el
thisya está enlazado.Enlace diferente de este ámbito a ES6 => operador de función
fuente
thisestá 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
thisen 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
bindocalloapply:y llamarlo en caso de
bind.También hay formas de usar
eval()para hacerlo, lo que no es muy recomendable .fuente
function myFunces 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