Немного поможет понять замыкания? - PullRequest
0 голосов
/ 14 февраля 2019

В уроке Flatiron, который я делаю для замыканий, есть следующий пример:

function retailPriceMaker(manufacturePrice) {
  return function(marketMultiplier) {
    return marketMultiplier * manufacturePrice;
  };
}

const retailPriceForNine = retailPriceMaker(9);

retailPriceForNine(2);
// 18

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

Я понимаю это настолько, насколько это причиняет боль моему мозгу.

Один способ, который делает это намного проще для меня, это думать об этом так:


retailPriceMaker(9) возвращает следующую функцию:

function(marketMultiplier) {
    return marketMultiplier * 9; 
  };

Где тот факт, что когда-либо существовала переменная с именем manufacturePrice , не имеет значения и может быть также удален из книг истории возвращенной функции.

Идея, чтозамыкание «записывает» значения, которые ему передают, вместо того, чтобы думать о переменных / аргументах, на которые ссылаются при кажущемся заочном, НАМНОГО легче обернуть мою голову.

Итак мой вопрос: это правильный способ думать ое закрытия или я что-то упустил?Это кажется немного слишком простым, и я предположил бы, что если бы мое объяснение было полностью верным:

  1. Действительно, замыкания можно было бы изучать таким образом
  2. Консоль JavaScript показала бы "заполненный"в "функции, когда вы вызываете возвращаемую функцию:
function retailPriceMaker(manufacturePrice) {
  return function(marketMultiplier) {
    return marketMultiplier * manufacturePrice;
  };
}

const retailPriceForNine = retailPriceMaker(9);

retailPriceForNine;
// ƒ (marketMultiplier) {
//    return marketMultiplier * 9;
//  }

Итак, что, если что, я пропускаю?Или я просто перевернул мир с ног на голову?(крайне маловероятно)

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Замыкания на самом деле являются очень простой концепцией с мощными последствиями.

Я не историк языков программирования и не могу дать сравнительный анализ на разных языках, но я полагаю, что они везде почти одинаковы, как это было определено вСпецификация схемы в 1975 году Sussman and Steel.

Итак, как мы можем описать замыкание самым простым способом?

Очень простое объяснение с точки зрения интерпретатора (хотя, возможно, не "математически" правильное)

Это просто хитрость, которая позволяет «нарушать правила» жизненного цикла переменной.

Давайте рассмотрим ваш пример:

/* 1. Each function have an own "namespace" where variables lives
   2. After `return` from a function it's namespace *must* be destroyed in "normal" cases 
      and every value *must* be deallocated */
function retailPriceMaker(manufacturePrice) { 
    /* 3. manufacturePrice - *must* be deallocated 
     after return from retailPriceMaker */
    return function(marketMultiplier) { 
    /* 4. But closures allows to "break" this rule 
          and languages that supports closures 
          do not deallocate "closed" values */
      return marketMultiplier * manufacturePrice; 
    };
    /* 5. manufacturePrice value here remains closed 
         and not deallocated after return */
}

Все станет намного проще, если вы подумаете оРаспределение и освобождение.

Просто обратите внимание, что:

  1. Без интерпретатора замыканий должен уничтожить значение после возврата из функции
  2. Замыкания позволяют "нарушить" это правило.«Закрытые» значения не уничтожаются после возврата
  3. Этот «трюк» сам по себе очень простой, но очень мощный
0 голосов
/ 14 февраля 2019

Нет, это слишком просто.Конечно, во многих случаях закрытая переменная является константой, и с таким же успехом может быть заполнена. Но в общем, вы должны учитывать, что она закрывается по переменной mutable :

var count = 0;
function increment() { // yes, this is a closure as well - `count` is in its scope
  count++;
}

console.log(count);
increment();
console.log(count);
increment();
console.log(count);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...