Я провел немало исследований в этой области, но кажется, что используемые методы противоречивы и разнообразны.
Вот несколько методов, которые я использовал в прошлом:
/* 1: */ typeof myFunc === 'function'
/* 2: */ myFunc.constructor === Function
/* 3: */ myFunc instanceof Function
В рамках своего исследования я посмотрел, как некоторые известные библиотеки достигли этого:
/* jQuery 1.2.6: */ !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
/* jQuery 1.3b1: */ toString.call(obj) === "[object Function]"
/* Prototype 1.6: */ typeof object == "function"
/* YUI 2.6: */ typeof o === 'function'
Я поражен, так много разных методов используется существами, наверняка, был согласован один приемлемый тест? И я совершенно не понимаю, какие намерения были в исполнении jQuery 1.2.6, выглядит немного ОТТ ...
Итак, мой вопрос остается, каков наилучший * способ проверки функции?
Буду также признателен за понимание некоторых из перечисленных выше методов, особенно jQuery 1.2.6. (Я вижу, что они делают, это просто странно)
[*] Под «лучшим» я подразумеваю наиболее распространенный кросс-браузерный метод.
РЕДАКТИРОВАТЬ: Да, я знаю, что это обсуждалось ранее, но я все еще хотел бы некоторое обсуждение наиболее эффективного метода. Почему так много разных методов?
До сих пор в обсуждениях SO упоминался только оператор typeof (в основном), но никто не намекал на эффективность альтернативных методов.