1

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

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

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

d357534({my json data}); 

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

从本质上讲,我试图做的是这样的:

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

如果您正在创建大量这些功能,请不要忘记在完成功能时删除功能,否则会泄漏内存。 – 2010-03-29 15:14:24

回答

8

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

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

这工作完美,谢谢! – 2010-03-12 19:34:39

+0

您也可以在创建之前进行检查,以验证它不存在。 – Cheeso 2010-03-15 13:05:56

+0

为什么这不适用于'。'(点)在'functionName'中。 或者你也可以说,如果我们定义函数名称,如OOP约定那么它不工作?例如..'window ['Incident'+ randomeint +'。showList'] = function {...} – 2016-10-28 12:24:43

0

为了使一个随机命名的全局变量,你可以这样做:

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

现在当然你得记住某处的随机名称的问题。你可以为设置一个随机的名字,也是可变的。那么你必须记住变量的名字,以便你可以看看它的值,然后知道如何找到你的函数。过了一段时间,事情开始变得怪异。

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变量。