usar sintaxis funciones funcion flecha example es6 cuando anonimas javascript function ecmascript-6

javascript - sintaxis - ¿Puedes unir las funciones de flecha?



map javascript (8)

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 a f :

var fBound = f.bind(o);

Y luego puedo llamar a fBound :

fBound();

Lo que generará esto (el objeto o ):

{''a'': 42}

¡Guay! ¡Encantador! Excepto que no funciona. En lugar de generar el objeto o , genera el objeto de window .

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.


Desde el MDN :

Una expresión de función de flecha tiene una sintaxis más corta en comparación con las expresiones de función y enlaza léxicamente el valor this (no enlaza sus propios this, argumentos, super o new.target). Las funciones de flecha son siempre anónimas.

Esto significa que no puede vincularle un valor como desee.


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 de this en javascript y this 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 donde fueron creados especialmente para resolver todos estos problemas y confusiones y evitar tener que usar bind o call o cualquier otra forma para preservar el alcance de la función.

TL; DR

No, no puede volver a vincular las funciones de flecha.



No puede "volver a vincular" una función de flecha. Siempre se llamará con el contexto en el que se definió. Solo usa una función normal.

De la especificación ECMAScript 2015 :

Cualquier referencia a argumentos, super, this o new.target dentro de una función de flecha debe resolverse en un enlace en un entorno léxico. Normalmente, este será el entorno de función de una función de cierre inmediato.


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:

((a, b, c) => { console.info(a, b, c) // 1, 2, 3 }).bind(undefined, 1, 2, 3)()

Pruébelo aquí: http://jsbin.com/motihanopi/edit?js,console


Quizás este ejemplo te ayude:

let bob = { _name: "Bob", _friends: [""], printFriends:(x)=> { x._friends.forEach((f)=> { console.log(x._name + " knows " + f); }); } } bob.printFriends = (bob.printFriends).bind(null,bob); bob.printFriends();


var obj = {value: 10}; function arrowBind(fn, context) { let arrowFn; (function() { arrowFn = eval(fn.toString()); arrowFn(); }).call(context); } arrowBind(() => {console.log(this)}, obj);


¿Las funciones de flecha ES6 realmente resuelven "esto" en JavaScript

El enlace anterior explica que las funciones de flecha no cambian con las funciones de bind, call, apply .

Se explica con un muy buen ejemplo.

ejecuta esto en el node v4 para ver el comportamiento "esperado",

this.test = "attached to the module"; var foo = { test: "attached to an object" }; foo.method = function(name, cb){ // bind the value of "this" on the method // to try and force it to be what you want this[name] = cb.bind(this); }; foo.method("bar", () => { console.log(this.test); }); foo.bar();