我打算使用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 :(得分: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
变量。