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