2015-07-27 4 views
7

C'è un modo per riassociare una funzione che è già associata a un altro oggetto tramite Function.prototype.bind?Funzione JavaScript bind override (come associarlo a un altro oggetto)

var a={}; 
var b={}; 
var c=function(){ alert(this===a); }; 
c(); // alerts false 
c=c.bind(a); 
c(); // alerts true 
c=c.bind(b); 
c(); // still alerts true 

So che posso usare un approccio diverso e mantenere una funzione di "pulito" per il legame, ma mi chiedo come riutilizzare una funzione già vincolati.

+1

confrontare gli oggetti con === è una cattiva idea ... – epascarello

+2

@epascarello ?? – Pointy

risposta

6

C'è un modo per riassociare una funzione che è già associata a un altro oggetto tramite Function.prototype.bind?

No. Dal ES2015 spec su Function.prototype.bind:

19.2.3.2 Function.prototype.bind (thisArg, ... args)

[...]

Nota 2: Se Target è una funzione freccia o una funzione associata, quindi il thisArg passato a questo metodo non verrà utilizzato dalle chiamate successive a F.

Questo era già vero anche per le versioni precedenti.

3

Cosa .bind() fa è quasi lo stesso di questo:

function likeBind(fun, thisValue) { 
    return function() { 
    var args = [].slice.call(arguments, 0); 
    return fun.apply(thisValue, args); 
    }; 
} 

Quindi:

c = likeBind(c, a); 

ti dà una funzione legata. Ora, anche se si tenta di ri-associare, la funzione vincolata originale esiste ancora in quella chiusura con il valore originariamente richiesto come this. I valori delle variabili all'interno delle chiusure possono essere modificati solo dall'interno della chiusura, quindi non c'è nulla che tu possa fare per svincolare una funzione legata come quella. Devi ricominciare dalla funzione originale.

Quindi, no.