Затворы оценил ява

Переход от   https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

Во-первых, объем переменных

Чтобы понять затворы, Javascript должен сначала понять особую сферу переменной.

Область действия переменной является не более чем на два типа: глобальные и локальные переменные.

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

  вар п = 999;

  Функция f1 () {
    оповещения (п);
  }

  f1 (); // 999

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

  Функция f1 () {
    были п = 999;
  }

  предупреждение (п); // ошибка

Существует необходимость обратить внимание, когда вы объявляете переменную внутри функции, обязательно используйте команду вара. Если вы этого не сделаете, вы на самом деле объявить глобальную переменную!

  Функция f1 () {
    п = 999;
  }

  f1 ();

  предупреждение (п); // 999

Во-вторых, как читать локальную переменную с внешней стороны?

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

То есть, внутри функции, а затем определить функцию.

  Функция f1 () {

    вар п = 999;

    Функция f2 () {
      оповещения (п); // 999
    }

  }

В приведенном выше коде, функция f2 включены в внутренние функции f1, f1 время все локальные переменные внутри f2 видна. Но обратное не локальные переменные внутри f2, f1 должен быть невидимым. Это Java-конкретный язык «цепочка областей» структура (цепь сфера), суб-объекты, чтобы найти все переменные родительский объект. Таким образом, все переменные родительского объекта, дочерние объекты видимы, а не наоборот.

Поскольку f1 f2 можно прочитать в локальной переменной, так долго, как f2 в качестве возвращаемого значения, мы не можем прочитать его внутренние переменные вне Ф1 еще!

  Функция f1 () {

    вар п = 999;

    Функция f2 () {
      оповещения (п);
    }

    вернуться f2;

  }

  Результат был = f1 ();

  результат(); // 999

В-третьих, понятие закрытия

Код на функцию f2 является замыкание.

«Закрытие» на различных профессиональной литературы (закрывающего) определение очень абстрактно, трудно понять. Я понимаю, что закрытие является функцией внутренних переменных может быть прочитан другими функциями .

Поскольку язык Javascript, только внутренняя функция подпрограмма читать локальные переменные, замыкание может быть просто интерпретировать как «определенную функцию в функции.»

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

В-четвертых, использование закрытия

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

Как понимать Библию? Рассмотрим следующий код.

  Функция f1 () {

    вар п = 999;

    Надд = функция () {п + = 1}

    Функция f2 () {
      оповещения (п);
    }

    вернуться f2;

  }

  Результат был = f1 ();

  результат(); // 999

  Надд ();

  результат(); // 1000

В этом коде, результат на самом деле функция закрытия f2. Он работает в общей сложности дважды, первый раз, когда значение равно 999, второе значение равно 1000. Это доказывает, что функция f1 в локальной переменной п сохранена в памяти и не сбрасывается автоматически после f1 вызова.

Почему это так? Причина заключается в том, что родительская функция f1 является f2 и f2 присваивается глобальной переменной, которая приводит к f2 всегда в памяти, и зависит от наличия f1 и f2, f1 поэтому всегда в памяти, а не после окончания вызова , сбор мусора (вывоз мусора) выздоровел.

Еще одним примечательным этого кода места, что «Надд = функция () {п + = 1}» линия, не используется в первой передней Надд вар ключевого слова, таким образом, Надд является глобальной переменной, а не локальная переменная. Во-вторых, значение является анонимным функцией Надд (анонимные функции), а сама эта функция является анонимным замыкание, это эквивалент Надд связующий, может работать на локальных переменных внутри функции вне функции.

В-пятых, использование замыканий Меры предосторожности

1) В связи с закрытием сделает функция переменных сохраняются в памяти, потребление памяти велика, она не может быть злоупотребляли закрытие, в противном случае это приведет к проблемам производительности веб-страницы в IE может привести к утечкам памяти. Решение, перед выходом из функции будут удалены все локальные переменные не используются.

2) Закрытие будет функционировать за пределами родителя, родитель функция изменяет значение внутренней переменной. Так, если взять материнскую функцию как объект (объект), чтобы использовать, закрытие общественных методов (Public Method), как внутренняя переменная в качестве частной собственности (частное значение), то вы должны быть осторожны, чтобы не просто изменить значение родительской функции внутренних переменных.

рекомендация

отwww.cnblogs.com/mofei12138/p/12037624.html
рекомендация