下面的脚本试图测试是否存在,例如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 :(得分: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.Method
为x
或null
时检查undefined
是错误的,但这些特殊值在逻辑上是错误的,因此上面的代码永远不会引发异常。< / p>
如果方法名称也是动态的,您可以使用等效的索引访问方法,仍然不需要eval
...例如:
m = "Method"
if (!window[key] || (typeof window[key][m]) != "function") return;