Проверка существования функции (динамически упоминаемой функции) - PullRequest
0 голосов
/ 02 марта 2012

Приведенный ниже скрипт пытается проверить существование, скажем, 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 фактически вызывает его, а затем выдает ошибку "функция не существует, бла-бла".

Как я могу проверить его наличие без ошибки?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2012

То, что вообще не требует eval, может быть

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

Это работает, потому что то, что логически верно, может быть безопасно проверено для участников (и возвращает undefined, если член отсутствует).

Ошибка проверять x.Method, когда x равен null или undefined, но эти специальные значения логически ложны, поэтому приведенный выше код никогда не вызывает исключение.

Если имя метода также является динамическим, вы можете использовать эквивалентный подход к индексированию, но без необходимости eval ... например:

m = "Method"
if (!window[key] || (typeof window[key][m]) != "function") return;
0 голосов
/ 02 марта 2012

Ах, я понял это, не осознавал, насколько это легко, потому что это функция внутри объекта, внутри объекта, который нужно постепенно тестировать с верхнего уровня, поэтому:

if (typeof (eval(key)) != 'object' || typeof (eval(key + '.Method')) != 'object' || (typeof (eval(funcToCall)) != 'function')) { return; } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...