Что такое закрытие?
Сначала посмотрим на кусок кода:
функция a () {var n = 0; function inc () {n ++; console.log (n); } inc (); inc (); } a (); // Консоль выходов 1, затем выходы 2Это просто. Давайте посмотрим на другой кусок кода:
функция a () {var n = 0; this.inc = function () {n ++; console.log (n); };} var c = new a (); c.inc (); // Консоль вывод 1C.INC (); // Консоль вывода 2Это просто.
Что такое закрытие? Это закрытие!
Функции, которые имеют доступ к переменным в рамках другой функции, являются закрытием. Здесь функция INC обращается к переменной N в конструкторе A, поэтому образуется закрытие.
Давайте посмотрим на другой кусок кода:
функция a () {var n = 0; function inc () {n ++; console.log (n); } return inc;} var c = a (); c (); // Консоль вывод 1c (); // Консоль вывода 2Посмотрим, как это выполнено:
var c = couter (), это предложение Couter () возвращает функцию Inc, тогда это предложение эквивалентно var c = inc;
c (), это предложение эквивалентно inc (); Обратите внимание , что имя функции - это просто идентификатор (указатель на функцию), а () - функция выполнения.
Следующие три предложения, переведенные в: var c = inc; inc (); inc ();, есть ли разница между ним и первым куском кода? Нет.
Что такое закрытие? Это закрытие!
Все учебники учебника любят использовать последний абзац, чтобы проиллюстрировать закрытие, но я думаю, что это усложняет проблему. Что здесь возвращается, так это имя функции. Студенты, которые никогда не видели программирования Tan Haoqiang C/C ++, могут не сразу отражать разницу между щедением () или нет, что означает, что этот метод написания поставляется с ловушкой. Хотя этот метод письма более заметен, я все еще люблю осознавать проблему и смотреть на код 1 и код 2. Вы все равно будете смущены по поводу вызова функции, вы будете смущены значением n?
Зачем вам нужно так писать?
Мы знаем, что каждая функция JS - маленькая черная комната. Он может получить внешнюю информацию, но внешний мир не может напрямую увидеть контент внутри. Поместив переменную N в небольшую темную комнату, за исключением функции INC, нет другого способа связаться с переменной n. Более того, определение переменной n с тем же именем вне функции A не влияет друг на друга. Это так называемое улучшение «инкапсуляции».
Причина, по которой вам необходимо использовать функцию возврата к возврату для идентификации INC, заключается в том, что функция INC не может быть вызвана непосредственно за пределами функции A, поэтому return Inc связан с внешними. Это в Code 2 также только ассоциируется с внешними.
Общие ловушки
Проверьте это:
function createFunctions () {var result = new Array (); for (var i = 0; i <10; i ++) {result [i] = function () {return i; }; } return result;} var funcs = createFunctions (); for (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}На первый взгляд, я думал, что он выводит 0 ~ 9, но я никогда не ожидал, что он выведет 10 10?
Ловушка здесь: функция с () - функция выполнения! Простое предложение var f = function () {alert ('hi'); }; не будет всплыть, и следующее предложение f (); Выполнит код внутри функции. Приведенный выше код переводится как:
var result = new Array (), i; Result [0] = function () {return i; }; // Функция не выполняется, функция остается неизменной, и I в функции не может быть заменена! Результат [1] = function () {return i; }; // Функция не выполняется, функция остается неизменной, и I в функции не может быть заменена! ... результат [9] = function () {return i; }; // Функция не выполняется, функция остается неизменной, и I в функции не может быть заменена! i = 10; funcs = result; result = null; console.log (i); // funcs [0] () предназначен для выполнения оператора return i, который должен возвращать 10 -ancole.log (i); // funcs [1] () предназначен для выполнения оператора return i, который должен вернуть 10 ... console.log (i); // funcs [9] () предназначен для выполнения оператора return i, который должен вернуть 10Почему только сборы мусора, но не я? Потому что меня все еще ссылается на функцию. Это как ресторан, где пластины всегда ограничены, поэтому официант пойдет на патрулирование Тайваня, чтобы перерабатывать пустые тарелки, но как он смеет собрать тарелки, которые все еще содержат овощи? Конечно, если вы сами вручную вылейте блюда (= NULL), тарелка будет забрана. Это так называемый механизм переработки памяти.
Что касается того, как я все еще могу быть сохранен, на самом деле, читать ее весь путь с самого начала статьи не должна быть чем -то, о чем беспокоиться. Разве не нужно есть один кусок блюда на тарелке, чтобы потерять один кусок?
Давайте обобщусь
Закрытие - это переменная, которую функция относится к другой функции. Поскольку на переменную ссылку, она не будет переработана, поэтому ее можно использовать для инкапсуляции частной переменной. Это преимущество и недостаток. Ненужные закрытия только увеличат потребление памяти! Кроме того, при использовании закрытия вы также должны обратить внимание на то, соответствует ли значение переменной ваши требования, потому что это похоже на статическую частную переменную. Закрытие обычно смешивается со многими вещами, и только после контакта с ними с большим пониманием мы можем углубить наше понимание. Здесь мы просто говорим о основных вещах.
Ссылка на эту статью: http://www.cnblogs.com/qieguo/p/5457040.html
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.