如何创建随机方法名称

时间:2010-03-12 19:26:51

标签: javascript json javascript-events jsonp unobtrusive-javascript

我打算使用JSONP调用外部Web服务来解决这个事实,即我不想创建一个可能与调用页面冲突的全局函数。我认为创建一个随机函数名称并将其传递起来会起作用。像这样:

<script src="www.foo.com/b?cb=d357534">

其中cb是回调函数名称,服务器将返回

d357534({my json data});

我想知道的是如何创建随机函数名称,我确定我可以使用eval,但这是最好的方法吗?

基本上,我想要做的是:

var d + Math.floor(Math.random()*1000001) = function(){...   

3 个答案:

答案 0 :(得分:8)

这应该做你想要的。您需要在某处保存函数名称,以便将其传递给服务器,但您可以在本地范围内执行此操作,以避免污染全局命名空间。

var functionName = 'd' + Math.floor(Math.random()*1000001);
window[functionName] = function() { ... }

答案 1 :(得分:1)

要创建一个随机命名的全局变量,您可以这样做:

window['randomvar' + Math.floor(Math.random()*1000001)] = function() { ... };

现在你当然遇到了在某处记住随机名称的问题。您也可以为那个变量组成一个随机名称。然后你必须记住那个变量的名称,这样你就可以查看它的值,然后知道如何找到你的函数。过了一会儿,事情会开始变得怪异。

答案 2 :(得分:1)

为什么不在每次需要新功能时都使用计数器并递增计数器:

var name = "callback" + window.COUNTER++;
window[name] = function() { ... };

如果你想避免乱扔全局命名空间过多的引用,你可以(并且应该)将计数器和回调附加到单个全局对象:

var JSONP = window.JSONP;
var name = "callback" + JSONP.COUNTER++;
JSONP[name] = function() { ... };

在这种情况下,你可以调用这样的方法:

JSONP.callback_12(json);

粗略的是,您必须先初始化JSONP对象和COUNTER变量。