Как определить, определена ли функция в JavaScript?
Я хочу сделать что-то подобное
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Но это заставляет меня
обратный вызов не является функцией
ошибка, когда обратный вызов не определен.
javascript
reflection
Аарон Ли
источник
источник
Все текущие ответы используют литеральную строку, которую я предпочитаю не использовать в своем коде, если это возможно, - это не так (и обеспечивает ценное семантическое значение для загрузки):
Лично я стараюсь уменьшить количество строк, которые висят в моем коде ...
Кроме того, пока я знаю, что
typeof
это оператор, а не функция, использование синтаксиса делает его вредным для последнего.источник
isFunction(not_defined))
гдеnot_defined
имя функции, которая не определена, и FireBug вернул,not_defined is not defined
что является правильным, но ваша функция должна возвращать false и не генерировать ошибку ...not_defined
, чтобы передать его значение,isFunction()
и не может его разрешить. Ничто не может быть сделано для определенияisFunction()
этой проблемы.isFunction
и делайте просто(typeof no_function == typeof Function)
.typeof(Function())
потому что Function - это функция; но так же как Array, Object и другие встроенные прототипы (из-за отсутствия лучшего термина). Если бы вы проверяли массив, вы бы не использовали его,typeof(array) === typeof(Array)
например; вы будете использовать,typeof(array) === typeof(Array())
потому что вам действительно нужно оценить функцию, если вы будете осторожны и последовательны.Обратите внимание , что обратный вызов (сам по себе) принимает значение ,
false
если оноundefined
,null
,0
, илиfalse
. По сравнению сnull
является слишком конкретным.источник
callback
само значение равно false-y, то его typeof никогда не может быть «функцией».Эти методы, чтобы определить, реализована ли функция, также завершаются ошибкой, если переменная не определена, поэтому мы используем что-то более мощное, которое поддерживает получение строки:
источник
typeof window.doesthisexist
вместоdoesthisexist
. Однако использование eval (которое: является злом), как показано, будет работать только с именованными функциями - это не будет работать с вариантом использования в вопросе.Новое в JavaScript Я не уверен, изменилось ли поведение, но решение, данное Джейсоном Бантингом (6 лет назад), не будет работать, если возможная функция не определена.
Это вызовет
ReferenceError: possibleFunction is not defined
ошибку, когда движок попытается разрешить символ возможной функции (как указано в комментариях к ответу Джейсона).Чтобы избежать такого поведения, вы можете только передать имя функции, которую вы хотите проверить, если она существует. Так
Это устанавливает переменную либо как функцию, которую вы хотите проверить, либо как пустой объект, если она не определена, что позволяет избежать проблем, упомянутых выше.
источник
Пытаться:
источник
источник
источник
if(typeof Function === typeof callback)...
? :)typeof
позже возвращает что-то другое (может быть, «Function» вместо «function») из-за новой / другой реализации JavaScript - кажется, что это будет менее вероятно, что новая / другая реализация сломаетtypeof Function === typeof callback
проверку, потому что она должна быть одинаковой на семантическом уровне.источник
Я мог бы сделать
Я знаю, что есть принятый ответ, но никто не предложил это. Я не совсем уверен, соответствует ли это описанию idiomatic, но это работает для всех случаев.
В более новых движках JavaScript
finally
вместо них можно использовать.источник
typeof callback
любом случае.accepted_types.indexOf(typeof value) !== -1
ли он в диапазоне типов. В этой ситуации исключения были бы непомерными, на мой взгляд.Попробуй это:
источник
Если вы посмотрите на источник упомянутой библиотеки @Venkat Sudheer Reddy Aedama, underscorejs, вы можете увидеть это:
Это только моя подсказка, подсказка:>
источник
Пытаться:
источник
Если вы используете http://underscorejs.org , у вас есть: http://underscorejs.org/#isFunction
источник
Я искал, как проверить, была ли определена функция jQuery, и я не нашел ее легко.
Возможно, это может понадобиться;)
источник
type0f($.datepicker) !== undefiled
иначе будетobject
Если
callback()
вы вызываете функцию не один раз, вы можете инициализировать аргумент для повторного использования:Например:
Ограничение состоит в том, что он всегда будет выполнять аргумент обратного вызова, хотя он не определен.
источник
Для глобальных функций вы можете использовать это вместо
eval
предложенного в одном из ответов.Вы можете использовать
global.f instanceof Function
также, но afaik. значениеFunction
будет различным в разных кадрах, поэтому оно будет работать только с одним приложением. Вот почему мы обычно используемtypeof
вместо этого. Обратите внимание, что в некоторых средах могут быть и аномалииtypeof f
, например, в MSIE 6-8 некоторые функции, например,alert
имели тип «объект».По локальным функциям вы можете использовать тот, что в принятом ответе. Вы можете проверить, является ли функция локальной или глобальной.
Чтобы ответить на вопрос, пример кода работает для меня без ошибок в последних браузерах, поэтому я не уверен, что с ним было:
Примечание: я бы использовал
callback !== undefined
вместоcallback != null
, но они делают почти то же самое.источник
Большинство, если не все предыдущие ответы имеют побочные эффекты для вызова функции
здесь лучшая практика
у тебя есть функция
источник
Если вы хотите переопределить функции, лучше всего использовать переменные функций, которые определены в порядке их появления, поскольку функции определяются глобально, независимо от того, где они происходят.
Пример создания новой функции, которая вызывает предыдущую функцию с тем же именем:
источник
Это сработало для меня
источник
Однолинейное решение:
источник