Скажите, определяется ли функция Javascript, глядя на себя [имя] - это хороший способ? - PullRequest
4 голосов
/ 18 сентября 2008

Это дополнительный вопрос к Этот вопрос .

Мне нравится (и я понимаю) решение там. Однако в коде, в котором я работаю, используется другой способ решения той же проблемы:

function exist(sFN) {
    if(self[sFN]) return true;
    return false;
}

Кажется, работает нормально, хотя я не понимаю, как. Это работает? Как? Какие минусы у этого подхода? Стоит ли переходить к решению с другого вопроса?

Ответы [ 7 ]

7 голосов
/ 18 сентября 2008

Попробуйте это:

function exist(sFN) {
 return (typeof sFN == 'function');
}
6 голосов
/ 18 сентября 2008

Ваше условие проверяет наличие свойства "sFN" в объекте "self". Все, что не равно null, undefined, 0 и "", будет иметь значение true.

Как уже говорили другие, вы можете использовать typeof или instanceof, чтобы увидеть, действительно ли это функция.

Глядя на ваш связанный пример, вы должны прочитать разницу между == /! = И === /! == в javascript. Краткий ответ: ("" == null) - true, ("" === null) - false.

3 голосов
/ 18 сентября 2008

просто используйте typeof.

typeof(foobar)  // -> undefined
typeof(alert)   // -> function

Однако вы не можете определить функцию на основе typeof, потому что вам нужно будет передать идентификатор, который может не существовать. Поэтому, если вы определите function isfun(sym) { return typeof(sym) }, а затем попытаетесь вызвать isfun(inexistent), ваш код выдаст.

Самое интересное в typeof в том, что это оператор, а не функция. Таким образом, вы можете использовать его для проверки символа, который не определен, без броска.


если вы предполагаете, что функция находится в глобальной области видимости (то есть не в замыкании), вы можете определить функцию для проверки ее следующим образом:

function isfun(identifier) {
  return typeof(window[identifier]) == 'function';
}

Здесь вы передаете строку для идентификатора, так:

isfun('alert');   // -> true
isfun('foobar');  // -> false

закрытие

Вот пример функции, определенной в замыкании. Здесь напечатанное значение будет false, что неверно.

(function closure() { 
  function enclosed() {}
  print(isfun('enclosed'))
})()
1 голос
/ 18 сентября 2008

К вашему сведению: есть хорошая ловушка для typeof.

FF2 возвращает «функцию» для typeof (/ pattern /). FF3, IE7 и Chrome возвращают «объект» для одного и того же кода. (Я не могу проверить другие браузеры.)

Предполагая, что все, кто использовал FF2, обновились, вы в чистоте. Но это, вероятно, надуманное предположение.

0 голосов
/ 26 октября 2008

Object.prototype.toString.apply (значение) === '[Функция объекта]'

0 голосов
/ 23 октября 2008

Я где-то читал ( здесь и здесь ), что функции являются свойствами объекта окна, поэтому вы можете сделать следующее:

if (window.my_func_name) {
    my_func_name('tester!');
}

или для всплывающих окон:

if (window.opener.my_func_name) {
    my_func_name('tester!');
}

Полное решение тогда:

function function_exists(func_name) {
    var eval_string;
    if (window.opener) {
        eval_string = 'window.opener.' + func_name;
    } else {
        eval_string = 'window.' + func_name;
    }
    return eval(eval_string + ' ? true : false');
}
0 голосов
/ 18 сентября 2008

Вы не можете обернуть это в метод, но это так просто, что в этом нет необходимости.

function bob()
{}

if( typeof bob == "function" )
    alert( "bob exists" );

if( typeof dave != "function" )
    alert( "dave doesn't" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...