Questo codice mi spaventa. Non dovrebbe essere assolutamente usato. (A meno che non v'è una certa giustificazione davvero convincente per farlo;. Non sono a conoscenza di alcun ) Inoltre, non v'è alcun "programmazione funzionale" ha dimostrato nel codice qui sopra esclusi forse la uso di un callback. Ma diamine, anche C può banalmente farlo perché non c'era nessuna chiusura.
_
è solo un identificatore valido (come foo
o _foo
o $0
). Qui è usato per "non importa" (il valore è quello dell'intero testo abbinato in quanto la funzione è il "callback" per una corrispondenza RegExp).
$0
e $1
sono sostituiti rispettivamente da arguments[0]
e arguments[1]
, (ricordate che questo è una sostituzione testuale delle funzioni "a stringa" valore!). Avrebbe potuto essere digitato manualmente senza una "macro":
function() { return arguments[0] + arguments[1] }
O che cosa avrei fatto:
function (a,b) { return a + b }
Il resto (Function.toString
e eval(functionStr)
) è una sciocchezza per sostenere la roba "macro" che si basa su: Function -> codeString -> alteredCodeString -> Function
.
Questo codice richiede un funzionante aFunction.toString
che può emettere "sorgente come era". Non sono sicuro quando IE ha iniziato a supportarlo, ma sembra funzionare in IE9.
Questa è una piccola bugia, ma il posto unica ho usato un tale approccio coinvolti IE in una Sidebar Gadget in cui il DOM potrebbe essere "prematuramente scaricato" quando un flyout è stato ritirato e qualche altra confusione nel tentativo di invocare una funzione in un altro contesto window
. Una situazione all-about disordinato ..
La Functional JavaScript Library mostra quanto "macro magia" può essere fatto senza eval
.
fonte
2012-06-26 21:30:39
Grazie per la spiegazione (anche in basso). Questo è un caso di RTFM, poiché non ero a conoscenza (o avevo dimenticato) che replace() poteva assumere una funzione come secondo argomento. Questa era in realtà la mia confusione. Il tuo commento sulla funzione di callback per la corrispondenza RegExp è ciò che mi ha lasciato fuori, quindi ho tirato su la documentazione di String.replace() nel libro del rinoceronte. Non è del tutto chiaro il motivo per cui non mi è venuto in mente prima di postare su stackOverflow, ma grazie ancora. – pgoetz