2010-10-31 45 views
0

我正在使用jQuery。我有一個應用程序,它向使用JSON響應的服務器發出ajax請求。JS:使用變量名稱來調用函數

在某些情況下,從服務器的響應將指示JS函數的名稱。如果responseTyp的是「回調」作爲JSON的上方通過一個函數來處理這種反應被稱爲

{"responseType":"callback", "callback":"STUFF.TestCallback","callbackData":"this is in the callback"} 

類型。 (var的「響應」包含上面的JSON)

STUFF.callback = function(response){ 
    if(typeof response.callback =='function'){ 
     console.log("All Good") 
     response.callback(response); 
    }else{ 
     console.log("Hmm... Cant find function",response.callback); 
    } 
} 


STUFF.TestCallBack = function(data){ 
    alert("it worked"); 
} 

但是當我這樣做時,我得到錯誤「response.callback不是函數」。

任何意見,爲什麼這不起作用,以及如何正確地做到這一點將不勝感激。

回答

3

一個字符串是一個字符串,而不是一個函數。

response.callback()不起作用,因爲它是一樣的"STUFF.TestCallback"()STUFF.TestCallback()

你可能想擁有的數據結構的東西更像是"callback": "TestCallback"然後再去做:

STUFF[response.callback](response); 

在這裏,您使用String訪問STUFF的財產。 (foo.barfoo['bar']等同。)

+0

謝謝大衛!後視效果完美! – Alex 2010-10-31 18:26:37

0

雖然使用eval你propably可以做

var myfunction = eval(response.callback); 
myfunction(response); 

()被認爲是不好的風格有些JavaScript開發者。

+0

不良風格。難以維護。很難調試。速度慢,效率低下。安全問題的良好來源。 – Quentin 2010-10-31 17:56:02

1

你可以變換「namespace.func」到這樣的電話:

STUFF.callback = function(response) { 
    var fn = response.callback.split("."), func = window; 
    while(func && fn.length) { func = func[fn.shift()]; } 
    if(typeof func == 'function') { 
    console.log("All Good") 
    func(response); 
    } else{ 
    console.log("Hmm... Cant find function", response.callback); 
    } 
} 

這裏做的事情是通過獲取window["STUFF"]然後window["STUFF"]["TestCallback"]搶功能,因爲它循環,檢查是否每個級別的定義爲:去防止錯誤。請注意,這也適用於任何關卡功能,例如"STUFF.One.Two.func"也可以。

相關問題