← Назад к вопросам

Что покажет typeof для функции?

2.0 Middle🔥 181 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ на вопрос о typeof для функции

typeof для функции вернёт строку "function".

function exampleFunc() {}
const arrowFunc = () => {};
const asyncFunc = async () => {};

console.log(typeof exampleFunc); // "function"
console.log(typeof arrowFunc);   // "function"
console.log(typeof asyncFunc);   // "function"
console.log(typeof console.log); // "function"

Почему typeof возвращает "function"

  1. Исторические причины и спецификация
    Оператор typeof определён в спецификации ECMAScript, и для объектов, имеющих внутренний метод [[Call]] (что означает, что они могут быть вызваны), возвращается "function". Это поведение существует с ранних версий JavaScript для обратной совместимости.

  2. Функции — это объекты особого типа
    Функции в JavaScript являются объектами, но с дополнительными возможностями:

    function demo() {}
    demo.customProp = 'Значение';
    
    console.log(typeof demo); // "function"
    console.log(demo.customProp); // "Значение"
    console.log(demo instanceof Object); // true
    
  3. Практическая полезность
    Возврат "function" позволяет чётко отличать функции от других объектов, что критически важно для динамической типизации:

    const values = [42, 'текст', () => {}, {}, null, undefined];
    
    values.forEach(value => {
      if (typeof value === 'function') {
        console.log('Найдена функция:', value);
      }
    });
    

Важные исключения и нюансы

1. Стрелочные функции и другие типы функций

Все виды функций возвращают "function":

// Разные виды функций
console.log(typeof function() {});           // "function"  
console.log(typeof () => {});                // "function"
console.log(typeof function*() {});          // "function" (генератор)
console.log(typeof async function() {});     // "function"
console.log(typeof class {});                // "function" (класс — это функция)

2. Объекты, имитирующие функции

Объекты с методом call не считаются функциями:

const fakeFunc = {
  call: function() { return 'обман'; }
};

console.log(typeof fakeFunc); // "object", а не "function"
fakeFunc(); // TypeError: fakeFunc is not a function

3. Пограничные случаи

// null и undefined
console.log(typeof null);      // "object" (известная ошибка JavaScript)
console.log(typeof undefined); // "undefined"

// Host objects (объекты окружения)
// В некоторых старых браузерах для определённых объектов typeof мог возвращать
// нестандартные значения, но для функций всегда "function"

Почему это важно на практике

  1. Проверка перед вызовом

    const callback = getUserCallback(); // может вернуть функцию или undefined
    
    if (typeof callback === 'function') {
      callback(); // Безопасный вызов
    } else {
      console.error('callback не является функцией');
    }
    
  2. Отличие от других типов

    const api = {
      endpoint: '/data',
      handler: function() { /* ... */ },
      config: { method: 'GET' }
    };
    
    Object.entries(api).forEach(([key, value]) => {
      if (typeof value === 'function') {
        console.log(`${key} - вызываемый метод`);
      } else if (typeof value === 'object') {
        console.log(`${key} - объект конфигурации`);
      }
    });
    
  3. Метапрограммирование

    // Динамическое создание API
    const methods = ['get', 'post', 'put', 'delete'];
    const api = {};
    
    methods.forEach(method => {
      api[method] = function(data) {
        return fetch(`/api/${method}`, { 
          method: method.toUpperCase(), 
          body: JSON.stringify(data) 
        });
      };
    });
    
    // Проверка, что все методы созданы как функции
    Object.values(api).every(method => typeof method === 'function'); // true
    

Альтернативные способы проверки

Хотя typeof — наиболее распространённый способ, существуют и другие:

function testFunc() {}

// Разные подходы к проверке
console.log(typeof testFunc === 'function');          // true
console.log(testFunc instanceof Function);           // true  
console.log(Function.prototype.isPrototypeOf(testFunc)); // true
console.log(!!testFunc && testFunc.constructor === Function); // true
console.log(!!testFunc && typeof testFunc.call === 'function'); // true

Вывод: typeof для любой функции всегда возвращает строку "function", что является одним из немногих предсказуемых и консистентных поведений оператора typeof в JavaScript. Это знание фундаментально важно для любого фронтенд-разработчика, так как позволяет безопасно работать с функциями в условиях динамической типизации языка.