2012-03-02 50 views
0

下面的腳本試圖測試讓我們說存在的方法Utility.Method.PageInit();測試函數的存在(一個動態引用函數)

頁面對象與事件參數一樣動態地出現,所以我實際上並不知道它們會是什麼,所以我需要測試一個動態函數的存在(如果您理解正確)。

var key = page.attr('id'); 
var funcToCall = key + '.Method.' + event; 

//check if function exists, if it doesn't return, (guard statement) 
if (typeof (eval(funcToCall)) != 'function') { return; } 

問題是中,eval實際上是調用它,然後它拋出一個錯誤「功能不存在blahblah」。

如何測試它的存在而不會出現錯誤?

回答

0

啊,我想通了,不知道多麼容易,因爲它的對象內的函數,一個對象裏面,你需要從頂層向下逐步測試,所以:

if (typeof (eval(key)) != 'object' || typeof (eval(key + '.Method')) != 'object' || (typeof (eval(funcToCall)) != 'function')) { return; } 
0

東西不需要eval都可能是

if (!window[key] || (typeof window[key].Method) != "function") return; 

這個工作的原因是什麼邏輯真能爲大家安全檢查(並返回undefined如果成員不存在)。

這是檢查x.Methodxnullundefined一個錯誤,但這些特殊值是邏輯假所以上面從來沒有的代碼會引發異常。

如果方法名稱也是動態的,你可以使用等效的索引訪問的方式,仍然沒有需要eval ...例如:

m = "Method" 
if (!window[key] || (typeof window[key][m]) != "function") return;