2

我计划使用 JSONP 调用外部 Web 服务来解决我不想创建可能与调用页面发生冲突的全局函数的事实。我认为创建一个随机函数名称并传递它会起作用。像这样的东西:

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

cb回调函数名称在哪里,服务器会返回

d357534({my json data});

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

本质上,我想做的是:

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

3 回答 3

8

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

var functionName = 'd' + Math.floor(Math.random()*1000001);
window[functionName] = function() { ... }
于 2010-03-12T19:28:58.673 回答
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变量。

于 2010-03-29T12:23:06.650 回答
1

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

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

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

于 2010-03-12T19:31:07.903 回答