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

Какая видимость у обычной функции?

2.2 Middle🔥 141 комментариев
#JavaScript Core

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

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

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

Видимость обычной функции в JavaScript

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

Основные типы видимости для обычной функции

1. Глобальная видимость

Если функция объявлена в глобальной области видимости (т.е. не внутри другой функции или блока), она доступна везде в коде, включая другие функции и блоки. Это иногда называют функцией верхнего уровня.

// Глобальная функция
function globalFunc() {
    console.log('Я доступна везде');
}

// Можно вызвать внутри другой функции
function anotherFunc() {
    globalFunc(); // Работает
}

// Можно вызвать в блоке
{
    globalFunc(); // Работает
}

2. Локальная видимость (внутри функции)

Если функция объявлена внутри другой функции (локальная функция или вложенная функция), она доступна только внутри этой родительской функции и её внутренних блоков, но не вне её.

function outerFunc() {
    // Локальная функция, видимая только внутри outerFunc
    function innerFunc() {
        console.log('Я видна только внутри outerFunc');
    }
    
    innerFunc(); // Работает
}

innerFunc(); // Ошибка: innerFunc не определена
outerFunc(); // Вызов outerFunc выполнит innerFunc внутри

3. Видимость в пределах блока (не для обычных функций!)

Важный момент: обычные функции, объявленные с function, не имеют блочной видимости в ES5 и в большинстве контекстов ES6. Они имеют функциональную видимость. Это отличается от let/const переменных и стрелочных функций, которые могут иметь блочную видимость.

if (true) {
    // Обычная функция в блоке - всё равно имеет функциональную/глобальную видимость!
    function blockFunc() {
        console.log('В старом ES5 я была видна вне блока!');
    }
}
// В ES5 это могло работать, в ES6 зависит от режима (strict/non-strict)
blockFunc(); // Поведение может различаться

В строгом режиме ('use strict') ES6 обычные функции внутри блока действительно получают блочную видимость, что делает поведение более логичным и схожим с let.

'use strict';
if (true) {
    function strictBlockFunc() {
        console.log('Я видна только внутри блока в strict mode');
    }
    strictBlockFunc(); // Работает
}
strictBlockFunc(); // Ошибка в strict mode

Сравнение с другими видами функций

  • Функции через let/const: Если создать функцию как переменную через let func = function() {}, она будет иметь видимость этой переменной (блочную, если внутри блока).
  • Стрелочные функции: const arrowFunc = () => {} — имеют видимость переменной, к которой присвоены.
  • Function Expression: const myFunc = function() {} — видимость зависит от переменной.

Практическое значение видимости

Видимость функции влияет на:

  • Возможность вызова из разных частей кода.
  • Замыкания: локальные функции могут захватывать переменные родительской функции.
  • Изоляция кода: локальные функции помогают скрыть логику внутри модуля.
  • Переопределение: глобальные функции можно случайно переопределить.

Пример замыкания с локальной видимостью

function createCounter() {
    let count = 0;
    // Локальная функция, видимая только внутри createCounter
    function increment() {
        count++;
        console.log(count);
    }
    return increment;
}

const counter = createCounter();
counter(); // 1
counter(); // 2
// increment() напрямую вызвать нельзя — она локальная!

Итог

Обычная функция (function) имеет видимость в пределах области объявления:

  • В глобальной области — видна везде.
  • В функциональной области — видна только внутри этой функции.
  • В блочной области — зависит от режима (в strict mode ES6 — блочная видимость).

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

Какая видимость у обычной функции? | PrepBro