Come si crea un nome metodo casuale
-
19-09-2019 - |
Domanda
Ho intenzione di utilizzare JSONP di chiamare un webservice esterni per aggirare il fatto che io non voglio creare una funzione globale che potrebbe potenzialmente in conflitto con la pagina chiamante. Ho pensato che la creazione di un nome di funzione random e passando in su avrebbe funzionato. Qualcosa di simile a questo:
<script src="www.foo.com/b?cb=d357534">
dove CB è il nome della funzione di callback, il server sarebbe tornato
d357534({my json data});
quello che voglio sapere è come creare il nome della funzione casuale, sono sicuro che potrei usare eval
ma è questo il modo migliore per andare a questo proposito?
in sostanza, quello che sto cercando di fare è questo:
var d + Math.floor(Math.random()*1000001) = function(){...
Soluzione
Questo dovrebbe fare quello che vuoi. È necessario salvare il nome della funzione da qualche parte in modo che è possibile passare al server, ma si può fare all'interno di un ambito locale per evitare di inquinare lo spazio dei nomi globale.
var functionName = 'd' + Math.floor(Math.random()*1000001);
window[functionName] = function() { ... }
Altri suggerimenti
Per rendere una variabile globale a caso di nome si potrebbe fare questo:
window['randomvar' + Math.floor(Math.random()*1000001)] = function() { ... };
Ora, naturalmente, hai il problema di ricordare il nome casuale da qualche parte. Si potrebbe fare un nome casuale per la variabile che anche. Allora dovreste ricordare il nome di quel variabile , in modo che si poteva guardare il suo valore e quindi sapere come trovare la vostra funzione. Dopo un po ', le cose stanno andando per iniziare a ricevere strane.
Perché non basta usare un contatore e incrementarlo ogni volta che hai bisogno di una nuova funzione:
var name = "callback" + window.COUNTER++;
window[name] = function() { ... };
Se si vuole evitare di sporcare il namespace globale con troppi riferimenti si potrebbe (e dovrebbe) fissare il contatore e callback a un unico oggetto globale:
var JSONP = window.JSONP;
var name = "callback" + JSONP.COUNTER++;
JSONP[name] = function() { ... };
In questo caso si potrebbe chiamare il metodo in questo modo:
JSONP.callback_12(json);
Di grossolana si deve inizializzare il JSONP
object e la variabile COUNTER
prima.