测试函数的存在(动态引用的函数)

时间:2012-03-02 02:55:08

标签: jquery jquery-mobile

下面的脚本试图测试是否存在,例如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”。

如何在不出错的情况下测试它的存在?

2 个答案:

答案 0 :(得分:0)

啊我已经弄清楚了,没有意识到它是多么容易,因为它是一个对象内部的一个函数,一个对象需要从顶层逐步下来测试,所以:

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

答案 1 :(得分:0)

完全不需要eval的东西可能是

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

这是有效的,因为可以安全地检查成员的逻辑真实性(如果成员不存在,则返回undefined。)

x.Methodxnull时检查undefined是错误的,但这些特殊值在逻辑上是错误的,因此上面的代码永远不会引发异常。< / p>

如果方法名称也是动态的,您可以使用等效的索引访问方法,仍然不需要eval ...例如:

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