Questo codice semplificato esibisce un problema simile:
var x = Function.call.call;
x(alert);
In questo caso, una volta Function.call.call
viene chiamato, esso non ricordare il contesto da cui ha origine (cioè Function.call
). Per salvare questo contesto, si potrebbe usare questo
empia costrutto
trucco:
Function.call.bind(Function.call)
Esso restituisce una nuova funzione per cui il contesto Function.call
è destinata a se stesso, salvando così il contesto. È possibile salvare questa espressione in una nuova variabile:
var callFn = Function.call.bind(Function.call);
Ora, callFn(alert)
è identico a alert.call()
. Si noti che tutti gli argomenti aggiuntivi saranno passati così com'è, quindi callFn(alert, window)
invocherà alert.call(window)
. La comprensione di questo comportamento è importante nelle situazioni in cui callFn
viene chiamato come parte di un callback come Array.forEach
, in cui vengono passati tre argomenti in ogni iterazione.
fns.forEach(callFn);
Nel tuo caso, nessuna delle funzioni all'interno fns
utilizzano gli argomenti che sono passati, ma dietro le quinte si chiamano in questo modo:
fns[0].call(0, fns)
Così this
uguale l'indice dell'elemento (ie Number(0)
) e arguments[0]
è uguale alla serie di funzioni. L'osservatore acuto potrebbe aver notato che il valore dell'elemento cade tra le fessure, sebbene possa ancora essere referenziato usando arguments[0][this]
o, in alternativa, arguments.callee
(deprecato).
fonte
2013-04-10 10:48:26
Bingo, il gioco è fatto! Grazie molto. – georg
Buon seguito sugli argomenti, ma perché 'callee'? Cosa c'è di sbagliato con semplicemente 'argomenti [0] [questo]'? – georg
@ thg435 Questo è un buon punto; che funzionerebbe in questo caso :) aggiornato, grazie! –