Si è tentati di pensare bind
come in qualche modo modifica una funzione di utilizzare un nuovo this
. In questa interpretazione (errata), la gente pensa a bind
aggiungendo una sorta di bandiera magica alla funzione che gli dice di usare un altro this
la prossima volta che viene chiamato. Se così fosse, allora dovrebbe essere possibile "scavalcare" e cambiare la bandiera magica. E si potrebbe quindi chiedere, qual è la ragione per limitare arbitrariamente la capacità di farlo?
Ma in effetti, questo è non come funziona.bind
crea e restituisce una nuova funzione che quando chiamato richiama la prima funzione con un particolare this
. Il comportamento di questa funzione appena creata, per utilizzare lo this
specificato per chiamare la funzione originale, è masterizzato in quando viene creata la funzione. Non può essere modificato più di quanto gli interni di qualsiasi altra funzione restituita da una funzione potrebbero essere modificati dopo il fatto.
Può aiutare a guardare un vero e proprio semplice implementazione di bind
:
// NOT the real bind; just an example
Function.prototype.bind = function(ctxt) {
var fn = this;
return function bound_fn() {
return fn.apply(ctxt, arguments);
};
}
my_bound_fn = original_fn.bind(obj);
Come si può vedere, in nessuna parte bound_fn
, la funzione tornato da bind
, fa riferimento al this
con cui la funzione legata è stato chiamato. E 'ignorato, in modo che
my_bound_fn.call(999, arg) // 999 is ignored
o
obj = { fn: function() { console.log(this); } };
obj.fn = obj.fn.bind(other_obj);
obj.fn(); // outputs other_obj; obj is ignored
così posso legare la funzione tornato da bind
"nuovo", ma che è non rebinding la funzione originaria; si limita a legare la funzione esterna, che non ha alcun effetto sulla funzione interna, poiché è già impostata per chiamare la funzione sottostante con il contesto (valore this
) passata a bind
. Riesco a legare ancora e ancora, ma tutto ciò che finisco per fare è creare più funzioni esterne che possono essere associate a qualcosa ma che alla fine finiscono per chiamare la funzione più interna restituita dal primo bind
.
Pertanto, è in qualche modo fuorviante dire che bind
"non può essere sovrascritto".
Se si desidera "riassociare" una funzione, è possibile eseguire una nuova rilegatura sulla funzione originale. Quindi, se ho legato una volta:
function orig() { }
my_bound_fn = orig.bind(my_obj);
e poi voglio organizzare per la mia funzione originaria per essere chiamato con qualche altro this
, allora non associare nuovamente la funzione legata:
my_bound_fn = my_bound_fn.bind(my_other_obj); // No effect
Invece, ho appena creare una nuova funzione legata a quella originale: risposta eccellente
my_other_bound_fn = orig.bind(my_other_obj);
Strano! Bella domanda – Jivings
Il sito Web di ecma è inattivo ... Qualcuno conosce un mirror per le specifiche ECMAScript Web? – Jivings
Ottima domanda. Così buono, infatti, ha messo offline la specifica ES5. Penso che tu abbia infranto JavaScript. – joews