Como faço para criar um nome de método aleatório
-
19-09-2019 - |
Pergunta
Estou pensando em usar JSONP para chamar um webservice externo para contornar o fato de que eu não quero criar uma função global que poderia entrar em conflito com a página de chamada. Eu pensei que a criação de um nome de função aleatória e passando-se iria funcionar. Algo parecido com isto:
<script src="www.foo.com/b?cb=d357534">
onde cb é o nome da função de retorno de chamada, o servidor retornaria
d357534({my json data});
O que eu quero saber é como criar o nome da função aleatória, im certeza que eu poderia usar eval
mas esta é a melhor maneira de ir sobre ele?
Essencialmente, o que eu estou tentando fazer é esta:
var d + Math.floor(Math.random()*1000001) = function(){...
Solução
Isso deve fazer o que quiser. Você precisa salvar o nome da função em algum lugar de modo que você pode passá-lo para o servidor, mas você pode fazer isso dentro de um âmbito local para evitar a poluição seu namespace global.
var functionName = 'd' + Math.floor(Math.random()*1000001);
window[functionName] = function() { ... }
Outras dicas
Para fazer uma variável global aleatoriamente chamado você poderia fazer isso:
window['randomvar' + Math.floor(Math.random()*1000001)] = function() { ... };
Agora, é claro que você tem o problema de lembrar o nome em algum lugar aleatório. Você poderia fazer-se um nome aleatório para que variável também. Então você tem que lembrar o nome de que variável, de modo que você pode olhar para o seu valor e, em seguida, saber como encontrar a sua função. Depois de um tempo, as coisas vão começar a ficar estranho.
Por que não usar apenas um contador e incrementá-lo cada vez que você precisar de uma nova função:
var name = "callback" + window.COUNTER++;
window[name] = function() { ... };
Se você quer evitar jogar lixo no espaço global com muitas referências que você pode (e deve) fixar o balcão e retornos de chamada para um único objeto global:
var JSONP = window.JSONP;
var name = "callback" + JSONP.COUNTER++;
JSONP[name] = function() { ... };
Neste caso, você poderia chamar o método como este:
JSONP.callback_12(json);
De grosseiro você tem que inicializar o JSONP
object ea variável COUNTER
primeiro.