logo

Проверка определения функции в JavaScript перед вызовом

Быстрый ответ

Для проверки определенности функции можно воспользоваться оператором typeof. Это простой и эффективный способ:

JS
Скопировать код
typeof myFunction === "function" ? /* Функция существует */ : /* Функции нет, поэтому можно быть спокойным */;

Наличие функции не гарантирует её вызываемость

В динамичном мире JavaScript функции-колбэки передаются по цепочке, а их вызов может быть условным. Перед использованием функций необходимо убедиться в их определенности и корректности выполнения, чтобы избежать распространенной ошибки "callback is not a function".

JS
Скопировать код
if (typeof highlightCode === "function") {
  highlightCode(myBigCodeBlock);
} else {
  console.log('Ожидалась функция highlightCode, но, похоже, она была заменена на что-то неожиданное');
}

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

Зачем повторяться, если можно определить? – Введение в вспомогательные функции

Причина использования оператора typeof во многих случаях может заставить задуматься о вспомогательных функциях:

JS
Скопировать код
function isFunction(value) {
  return typeof value === "function";
}

// Пример использования:
if (isFunction(printThis)) {
  printThis("Привет, StackOverflow!");
}

Функция isFunction упрощает процесс проверки и делает код более понятным.

Визуализация

Визуализируйте процесс проверки функции в виде таблицы:

Markdown
Скопировать код
| Вызов функции      | Результат проверки       |
| ------------------ | ----------------------- |
| `myFunction()`     | 🛠️(Инструменты)         |
JS
Скопировать код
if (typeof myFunction === 'function') {
  // 🛠️ Вот она, работает, как часы!
} else {
  // 🚫 Функции нет. Возможно, myFunction не то, что нам нужно.
}

Неизведанные земли и краевые случаи

Функции – равноправные элементы JavaScript

В JavaScript функции могут передаваться как переменные, но также они могут изменяться и оказаться не тем, что ожидалось:

JS
Скопировать код
let supposedlyBusyFunction = 123;

if (isFunction(supposedlyBusyFunction)) {
  supposedlyBusyFunction(); // Ожидалась функция, а появилось число.
}

Поэтому всегда удостоверьтесь, что перед вами действительно функция.

Стрелочные функции и методы класса

С появлением стрелочных функций и методов класса в JavaScript изменяется поведение функций, особенно в части областей видимости и привязки this:

JS
Скопировать код
const partyArrowFunction = () => { /* Праздничная логика */ };

class Party {
  startParty() { /* Начинаем веселье */ }
}

let allNightParty = new Party();

console.log(isFunction(partyArrowFunction)); // true, стрелочная функция готова к вечеринке!
console.log(isFunction(allNightParty.startParty)); // true, метод класса готов веселить всю ночь!

Дома ли функция, или нет?

При проверке функций в разных контекстах, например window или global, следует обратить внимание на области видимости:

JS
Скопировать код
// В браузере:
if (isFunction(window.openTab)) {
  // openTab доступна в глобальной области видимости браузера.
}

// В Node.js:
if (isFunction(global.internetIsDown)) {
  // internetIsDown доступна в глобальной области видимости Node.js.
}

Понимание областей видимости поможет вам найти функции в сложной системе модулей JavaScript.