2012-11-22 15 views
6

Qualcuno può spiegare questa funzione?Spiegare la funzione bindbind()

var bindbind = Function.prototype.bind.bind(Function.prototype.bind); 

Capisco il risultato che produce:

var bindedContextFunc = bindbind(function)(context); 
bindedContextFunc(args); 

ma non capisco processo di creazione di queste funzioni, intendo parte bind(Function.prototype.bind)

+0

"contesto" sarebbe meglio come "QuestoValore" o simili. – RobG

+0

@RobG: Cosa c'è che non va con "* context *"? Lo vedo usato spesso e penso che sia più descrittivo del termine tecnico. Hai un link per me (noi) da leggere? – Bergi

+0

In ECMAScript, "contesto" viene utilizzato in relazione a [contesto di esecuzione] (http://ecma-international.org/ecma-262/5.1/# sec-10), che include tutti i parametri e l'ambito del codice attualmente in esecuzione. Include un valore 'this' ed è controllato da come viene scritto il codice. È statico Al contrario, il valore 'this' di una funzione è dinamico e impostato completamente da come viene chiamata la funzione, non ha nulla a che fare con il modo in cui la funzione è dichiarata o intializzata. Quindi definire "questo" contesto è inappropriato. Chi lo fa ha bisogno di leggere e comprendere le specifiche per il linguaggio che sta utilizzando. – RobG

risposta

4

OK. Abbiamo tre volte la funzione Function.prototype.bind qui, il cui codice (semplificato)

function bind(context) { 
    var fn = this; 
    return function() { 
     return fn.apply(context, arguments); 
    } 
} 

io abbreviare in uno stile più funzionale, con un sacco di applicazione parziale: bind fn (contesto) -> fn contesto.

Quindi cosa fa? Hai bind.call(bind, bind) o bind bind (binding). Espandiamolo per associare bind. Cosa succede se ora abbiamo fornito alcuni argomenti ad esso?

legano bind (bind) (fn) (contesto)

legano legano(fn) (contesto)

legano fn(contesto

.210

fn contesto

Eccoci. Siamo in grado di assegnare questo ad alcune variabili per rendere il risultato più chiaro:

bindbind = bind bind (bind)

bindfn = bindbind nulla (fn) // legano fn

contextbindfn = bindfn nulla (contesto) // fn contesto

risultato = contextbindfn nulla (args) // fn contesto (args)

+0

potresti spiegare perché questa soluzione è migliore (o forse dovrei chiedere perché esiste) se possiamo semplicemente fare 'fn.bind (context) (args)' per ottenere lo stesso risultato? – asdf

+1

Supponendo che tu abbia una API che vuole restituire il 'bindfn' - non conosce ancora il contesto. Quindi potresti usare 'Function.prototype.bind.bind (fn)' - che è lungo - o semplicemente 'bindbind (fn)'. Non sono sicuro che ci sia un'applicazione reale, comunque. – Bergi

Problemi correlati