Рубрики
Без рубрики

Для чего полезно закрытие?

Что такое закрытие? Закрытие – это внутренняя функция, которая ссылается на окружающую среду … Tagged с помощью JavaScript, Python, функционального, программирования.

Закрытие – это внутренняя функция, которая ссылается на среду в ее внешней функции. Простое закрытие выглядит так:

function outer(){
   let name = "John Doe";
   function inner(){
      return name;
   }
   return inner();
}  
>> outer() // returns "John Doe"

Закрытие можно использовать в JavaScript, Python, Ruby, Swift, C#, Objective C и на нескольких других языках. Я буду использовать простые примеры JavaScript, так как это похоже на большинство языков, и его легко понять. Я также приведу примеры Python, когда подход JavaScript не будет работать так же.

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

Закрытие имеет доступ к:

  1. Их локальная область (переменные, определенные внутри внутренней функции)
  2. Объем их внешних функций
  3. Глобальный объем

Теперь давайте используем более интуитивно понятный пример, чтобы понять, как использовать закрытие:

function setGreeting(greeting){
   function setName(name){
      return `${greeting}, ${name}`;
   }
   return setName;
}

Вполне эксплуатационная функция, внешняя функция принимает Приветствие как аргумент, и внутренняя функция принимает имя как аргумент и возвращает Приветствие и имя вместе. Вы можете заметить, что в отличие от первого примера, в этом случае внешняя функция возвращает внутреннюю функцию, не вызывая ее – без скобок . Мы посмотрим, как это влияет на код и как мы называем функции.

>> let welcome = setGreeting("Welcome")
>> // This sets greeting="Welcome"
>> typeof(welcome) // returns "function"
>> welcome // prints f setName(name){...}
>> // So welcome is equivalent to setName
>> // We can call it with the "name" argument
>> welcome("John") // prints "Welcome, John"
>> welcome("Joan") // prints "Welcome, Joan"

Из этого мы видим, что первый вызов SetGreeting Устанавливает приветствие и возвращает внутреннюю функцию для использования. Это означает, что мы можем использовать добро пожаловать Так же, как это было Имя набора . Это может быть очень полезно в тех случаях, когда нам нужны несколько функций, которые делают нечто похожее с различными контекстами, а не создают функцию для каждого приветствия, мы создаем одну функцию, чтобы установить приветствие и внутреннюю функцию для печати приветствия и имени. Это может показаться немного большим, чтобы принять участие, поэтому давайте посмотрим на практические варианты использования.

Создание функций с контекстом

Вы заполняете форму для всех выпускников в вашем отделе. Есть много деталей, и большинство из них кажутся общими для всех, например, отделение , Исадулт , Сертификат , Страна , гонка , факультет и т.п. С очень немногими уникальными полями, как FullName и Stateoforigin . Вы можете легко создать закрытие, где все общие поля устанавливаются внешней функцией, а внутренняя функция принимает только уникальные поля:

function setGeneral(general){
   // general is an object containing all general details
   function setUnique(fullName, stateOfOrigin){
      // We use the spread operator "..." 
      // to add fullName and stateOfOrigin to the object
      fillForm({...general, 
         fullName: fullName, 
         stateOfOrigin: stateOfOrigin
         });
   }
   return setUnique;
}
>> cs = {department:"Computer Science",
>> isAdult: true,
>> certificate: "B.Sc. Comp",
>> country: "Nigeria",
>> race: "Negro",
>> faculty: "ICT"};
>> csStudent = setGeneral(cs);
>> // Now we can use csStudent to easily fill forms
>> csStudent("John Doe", "Lagos")
>> csStudent("Ciroma Chukwuma", "Abuja")

Синтаксис для Python похож, используя словарь, мы обновили бы его с помощью FullName и Stateoforigin Ключи с использованием general.update ({"fullName": fullName, "stateoforigin": stateoforigin})

Создание частных атрибутов

Такие языки, как Java, дают вам возможность сделать определенные атрибуты (свойства) частными. Это не тот случай для JavaScript или Python. Но мы можем обеспечить соблюдение этого использования закрытия.

function Person(){
   let name = "";
   let age = 0;

   function setName(name){
      name = name;
   }
   function getName(){
      return name;
   }
   function grow(){
      age += 1;
   }
   function getAge(){
      return age;
   }

   accessible = {setName: setName,
                 getName: getName,
                 grow: grow,
                 getAge: getAge};
   return accessible;
}
>> john = Person()
>> john.setName("John")
>> john.grow();
>> john.grow();
>> john.getName() // prints "John"
>> john.getAge() // prints 2
>> john.name // undefined
>> john.age // undefined

Это простое объектно -ориентированное применение закрытия, которое можно использовать для имитации личных атрибутов. Функция возвращает объект (словарь) функций, чтобы быть доступными извне Человек функция, что делает их доступными по точечной нотации ( то есть john.grow () ). При сохранении атрибутов не возвращаются – имя и возраст – Недоступно за пределами Человек функция

Ключи словаря Python нельзя получить с помощью точек, так что вот способ сделать то же самое в Python

from types import SimpleNamespace
def Person():
   #same code, but in Python
   def grow():
      nonlocal age
      #python needs to know age is not a local
      #variable before directly operating on it
      age += 1
   accessible = {}#same thing as well
   return SimpleNamespace(**accessible)
# And that's it, SimpleNamespace will make them 
# accessible using dot notation

Резюме

С лучшим пониманием закрытия мы можем сказать, что закрытие – это функции, которые сохраняют их пространство имен (переменные и/или функции) после выполнения. Впервые до того, как можно было настроить начальную среду перед использованием. Имейте в виду, что закрытие включает в себя несколько функций, что делает ваш код немного медленнее и больше воспользовалась памятью. Старайтесь избегать их использования, если вы не получаете преимущества, связанные с закрытыми. В противном случае наслаждайся.

Оригинал: “https://dev.to/redmartian/what-are-closures-good-for-1nmb”