Riesci a bind le funzioni di freccia?

Ho sperimentato con ES6 per un po ‘ora, e ho appena avuto un piccolo problema.

Mi piace molto usare le funzioni di freccia, e ogni volta che posso, li uso.

Tuttavia, sembrerebbe che non puoi vincolarli!

Ecco la funzione:

var f = () => console.log(this); 

Ecco l’object che voglio associare alla funzione:

 var o = {'a': 42}; 

Ed ecco come legherei f a o :

 var fBound = f.bind(o); 

E poi posso solo chiamare fBound :

 fBound(); 

Che produrrà questo (l’object o ):

 {'a': 42} 

Freddo! Bello! Tranne che non funziona. Invece di emettere l’object o , emette l’object window .

Quindi mi piacerebbe sapere: puoi associare le funzioni di freccia? (E se sì, come?)


Ho testato il codice sopra in Google Chrome 48 e Firefox 43 e il risultato è lo stesso.

Non è ansible “riassociare” una funzione freccia. Sarà sempre chiamato con il contesto in cui è stato definito. Basta usare una funzione normale.

Dalla specifica ECMAScript 2015 :

Qualsiasi riferimento agli argomenti, super, this o new.target all’interno di ArrowFunction deve risolversi in un binding in un ambiente che racchiude lessicamente. In genere questo sarà l’Ambiente delle funzioni di una funzione che racchiude immediatamente.

Dal MDN :

Un’espressione di una funzione di freccia ha una syntax più breve rispetto alle espressioni di funzione e associa lessicalmente questo valore (non associa il proprio questo, argomenti, super o new.target). Le funzioni delle frecce sono sempre anonime.

Ciò significa che non è ansible associarvi un valore come desiderato.

Per essere completo, puoi re-associare le funzioni di freccia, non puoi cambiare il significato di this .

bind ha ancora valore per gli argomenti della funzione:

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

Provalo qui: http://jsbin.com/motihanopi/edit?js,console

Per anni, gli sviluppatori di js hanno faticato con il contesto vincolante, hanno chiesto perché this cambiato in javascript, tanta confusione nel corso degli anni a causa del contesto vincolante e della differenza tra il significato di this in javascript e this nella maggior parte degli altri linguaggi OOP.

Tutto questo mi porta a chiedere, perché, perché! perché non vorresti riassociare una funzione di freccia! Quelli creati appositamente per risolvere tutti questi problemi e confusioni ed evitare di dover usare bind o call o qualsiasi altro modo per preservare l’ambito della funzione.

TL; DR

No, non puoi riassociare le funzioni di freccia.

Ho fatto la stessa domanda un paio di giorni fa.

Non è ansible associare un valore poiché this è già associato.

Associazione di questo ambito a ES6 => operatore di funzione

Le funzioni freccia ES6 risolvono realmente “questo” in JavaScript

Il collegamento sopra riportato spiega che le funzioni di freccia non cambiano con bind, call, apply funzioni bind, call, apply .

È spiegato con un bell’esempio.

eseguire questo nel node v4 per vedere il comportamento “atteso”,

 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();