<MyRusakov.ru />

Программирование на C# с Нуля до Гуру

Программирование на C# с Нуля до Гуру

Данный курс научит Вас программировать на языке C#, который является одним из самых востребованных языков программирования в мире. Курс состоит из 7 разделов, в которых Вы с нуля освоите этот язык и сможете создавать самые разные программы для самых разных задач любой сложности.

В курсе Вы получите всю необходимую теоретическую часть, а также увидите массу практических примеров, в том числе, и из моей практики. Дополнительно, почти к каждому уроку идут упражнения.

Помимо самого курса Вас ждут ещё 3 бесплатных ценных Бонуса: «Технология Windows Presentation Foundation», «Создание библиотеки классов» и «Правильная работа со справочником».

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Замыкание функций в JavaScript

Замыкание функций в JavaScript

На этом уроке мы разберем, что такое замыкание функции, простыми словами. Если коротко, то замыкание - это функция внутри другой функции. И правда, звучит очень просто, но без привязки к конкретной задачи, понятие "замыкание" так и останется пустым звуком. Я просто хочу знать, в каких случаях мне нужно применять эту технологию.

Замыкание и область видимости

Так или иначе, но все эти пляски с бубном вокруг замыканий, напрямую связаны с областью видимости. Все переменные созданные внутри функции, являются локальными. А переменные созданные вне функции - глобальными.


Пример функции с локальными переменными

function one() {
    let a = 10;
    return a * 10;
}

// Вызов функции
console.log(one()); // 100

Локальная переменная видна только внутри блока, в котором она объявлена. Если мы попытаемся обратиться к локальной переменной вне этого блока, то гарантированно получим ошибку. Поскольку переменная не находится в области видимости данной функции.

function one() {
    let a = 10;
    return a * 10;
}

// Вывод переменной
console.log(a); // a is not defined


Пример функции c глобальными переменными

let a = 10;

function one() {
    return a * 10;
}

console.log(a); // 10
console.log(one()); // 100

Совсем иначе дело обстоит с глобальными переменными, объявленными за пределами блока. Глобальные переменные доступны в любом месте в данном коде.

В чем подвох?

Драма состоит в том, что когда код разрастается или над ним работает несколько человек, становится тяжелее отслеживать логику глобальных и локальных переменных. Сейчас объясню на примере.

let a = 10;

function one() {
    let a = 15;
    return a * 10;
}

console.log(a); // 10
console.log(one()); // 150

В консоли вывелась глобальная переменная с числом 10 (так и должно быть), но обратите внимание на число 150, в данном математическом расчете уже участвовала локальная переменная a, с числом 15. Переменные внутри функции живут в тот момент, когда используется в вычислениях или вызывается эта функция. Как только функция one() прекратила свое существование, локальная переменная a просто исчезла. При таких условиях, нарушается работа счётчика.

let a = 0;

function one() {
    a = a + 1;
    return a;
}

console.log(one()); // 1
console.log(one()); // 2
console.log(one()); // 3

Вроде все хорошо, счетчик работает корректно, но есть в этом коде одно слабое место - глобальная переменная a, к которой обращается функция. Проблема в том, что объявленная глобальная переменная, оторвана от функции. Например какой-нибудь программист переопределит глобальную переменную, не заметив её связи со счетчиком. Тогда нарушится работа счетчика, ведь все функции имеют доступ к глобальным переменным. Получается, что глобальная переменная беззащитна. Так вот, для защиты глобальных переменных и были придуманы замыкания.

Пример замыканий

Замыкания делают код безопаснее, защищают его от нежелательных переопределений глобальных переменных. Сделаем такую хитрость,поместим функцию one() внутри другой функции wrap(). Это даст следующее: Когда будет вызвана функция wrap(), JavaScript создаст переменную a внутри функции wrap() и эта переменная не прекратит свое существование. Таким образом мы получим несколько экземпляров области видимости, внутри которых существуют свои переменные a.

function wrap() {
    let a = 0;
    return function() {
        a = a + 1
        return a;
    }
}

В момент вызова wrap(), в JavaScript создается блок видимости, внутри которого функция видит внешние по отношению к себе переменные. И никто другой, кроме этой функции, не имеет доступа к переменным и не может их изменить. А все потому, что переменные одной области видимости замкнуты внутри другой области видимости. Отсюда и происходит название - замыкание. Мы получаем возможность делать переменные, которые недоступные никому, кроме функций.

Как определить где необходимо замыкание?

Замыкания активно используются для создания счетчиков. Если вам нужна переменная, к которой никто больше не будет иметь доступа, то замыкание - это то, что вам нужно.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.