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

Как можно посчитать тело функции?

2.3 Middle🔥 111 комментариев
#JavaScript Core

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

Способы подсчёта тела функции в JavaScript

В контексте собеседования "подсчёт тела функции" может означать несколько вещей.

1. Получение текста функции через toString()

Каждая функция в JavaScript имеет встроенный метод toString(), который возвращает строку с полным кодом функции:

function greet(name) {
  console.log(`Hello, ${name}!`);
  return true;
}

const bodyText = greet.toString();
console.log(bodyText);
// Выведет:
// function greet(name) {
//   console.log(`Hello, ${name}!`);
//   return true;
// }

Для стрелочных функций это работает точно так же:

const arrow = (x) => {
  const result = x * 2;
  return result;
};

console.log(arrow.toString());

2. Подсчёт количества строк в теле функции

Если нужно узнать, сколько строк кода в функции:

function countFunctionLines(fn) {
  const bodyText = fn.toString();
  const lines = bodyText.split('\n').length;
  return lines;
}

function example() {
  const a = 1;
  const b = 2;
  return a + b;
}

console.log(countFunctionLines(example));

3. Извлечение только тела без сигнатуры

Если нужно получить только содержимое функции без объявления:

function extractBody(fn) {
  const text = fn.toString();
  const startIndex = text.indexOf('{') + 1;
  const endIndex = text.lastIndexOf('}');
  return text.substring(startIndex, endIndex).trim();
}

function test() {
  console.log('Hi');
  return 42;
}

console.log(extractBody(test));

4. Анализ сложности функции

В интервью часто спрашивают о времени выполнения функции. Это означает анализ её алгоритмической сложности (Big O notation):

// O(1) - постоянное время
function isEven(n) {
  return n % 2 === 0;
}

// O(n) - линейное время
function sumArray(arr) {
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }
  return sum;
}

// O(n^2) - квадратичное время
function bubbleSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

5. Практический пример: анализатор функции

function analyzeFunction(fn) {
  const text = fn.toString();
  return {
    fullText: text,
    lineCount: text.split('\n').length,
    characterCount: text.length,
    hasAsync: text.includes('async'),
    hasReturn: text.includes('return'),
    hasLoop: text.includes('for') || text.includes('while')
  };
}

Ограничения и особенности

  1. Native функции: Для встроенных функций (например, Array.map) toString() возвращает [native code]
  2. Минифицированный код: Если функция была минифицирована, toString() вернёт минифицированный вариант
  3. Функции с eval: Трудно анализировать функции, созданные через eval() или конструктор Function
  4. Производительность: Использование toString() имеет некоторый оверхед

При интервью важно понимать, о каком именно подсчёте идёт речь, и выбрать наиболее релевантный подход к решению.