2013-06-03 90 views
1
var myNamespace = { 
    dateController: {} 
}; 

myNamespace.dateController = function(callback) { 
    this.callbackfunction = callback; 
    try { 
     [this.callbackfunction](); 
    } catch (e) { 
     alert(e); 
    } 
}; 

function displayDate() { 
    alert("displayDate"); 
    myNamespace.dateController("displayDateFromController"); 
}; 

function displayDateFromController() { 
    alert("In displayDateFromController"); 
};  

這段代碼給我TypeError: ["displayDateFromController"] is not a function錯誤。什麼可能是這個問題的根本原因和可能的解決方案。Javascript-從命名空間回調函數問題?

爲什麼dateController無法識別displayDateFromController作爲函數。

我已經厭倦了這樣的 http://www.w3schools.com/js/tryit.asp?filename=tryjs_events

+0

幾個問題:1)離開了'[]'。你實際做的是把'this.callbackfunction'放在一個數組中,並試圖將該數組作爲一個函數來調用。 2)不要將functionName作爲字符串傳遞給'dateController'函數。相反,只是傳遞函數本身:'myNamespace.dateController(displayDateFromController);' – basilikum

+0

我累了也... this.callbackfunction()仍然給我同樣的錯誤。 – harshit2811

回答

0

您必須刪除括號待命:

try{ 
    this.callbackfunction(); 
} 
catch(e) 
{ 
    alert(e); 
} 

,並傳遞給函數不帶引號:

function displayDate() 
{ 
    alert("displayDate"); 
    myNamespace.dateController(displayDateFromController); 
}; 
2

您需要將實際功能傳遞給datecontroller方法而不是String

var myNamespace = { 
    dateController: {} 
}; 

myNamespace.dateController = function (callback) 
{ 
this.callbackfunction = callback; 
try{ 
    //remove [] surrounding function 
    this.callbackfunction(); 
    } 
    catch(e) 
    { 
     alert(e); 
    } 
}; 

//Declare this method prior to displayDate 
function displayDateFromController() 
{ 
    alert("In displayDateFromController"); 
}; 

function displayDate() 
{ 
    alert("displayDate"); 
    //Pass function instead of string 
    myNamespace.dateController(displayDateFromController); 
}; 

displayDate(); 

工作實例:http://jsfiddle.net/RDMHV/

如果您仍需要一個String的靈活性:

var myNamespace = { 
    dateController: {} 
}; 

myNamespace.dateController = function (callback) 
{ 
this.callbackfunction = this[callback]; 
try{ 
    this.callbackfunction(); 
    } 
    catch(e) 
    { 
     alert(e); 
    } 
}; 

myNamespace.displayDateFromController = function(){ 
    alert("In displayDateFromController"); 
}; 

function displayDate() 
{ 
    alert("displayDate"); 
    myNamespace.dateController("displayDateFromController"); 
}; 

displayDate(); 

工作實例http://jsfiddle.net/RDMHV/1/

+0

感謝@Kevin的快速回復......我可以將您的答案與函數指針的基本關聯。我知道,但在這種情況下,我有一些具體的要求,我必須保持字符串中的函數名稱。是否有可能仍然將函數名稱作爲字符串傳遞並從控制器調用相同。 – harshit2811

+0

是否有必要在第二個代碼庫中的myNamespace中使用displayDateFromController?我有沒有類似於displayDate?其實我把這個問題與全局命名空間和myNamespace範圍問題聯繫起來。 displayDateFromController是globale命名空間的一部分,這就是爲什麼它沒有從字符串中檢測函數。 – harshit2811