Вот возможное использование закрытия:
var getUid = function() {
var uid = 1;
return function() {
return uid++;
};
};
// invoke the wrapping function immediately
// to create a single local scope
getUid = getUid();
getUid(); // 1
getUid(); // 2
getUid(); // 3
Как вы можете видеть, закрытие позволяет сохранить «UID» локальную переменную «живой» между вызовами функций. Его значение сохраняется в памяти, он является постоянным, в отличие от, когда нет внутренней функции:
var getUid = function() {
var uid = 1;
return uid++;
};
getUid(); // 1
getUid(); // 1
getUid(); // 1
Чтобы подвести итог, интересный материал о затворов является возможность сделать локальные переменные persistents.
В вашем примере есть что-то, что стоит заметить. Обратите внимание на то, что письмо a()()
такое же, как написание (a())()
. Это означает, что вы сначала вызываете функцию обертывания «a», , которая создает новую область, поэтому все внутри «a» полностью воссоздано.
Если вы продолжаете создавать новые области, таким образом, нет причин использовать закрытие. Действительно, делая это, вы теряете способность сохранять постоянные переменные между вызовами функций (как объяснялось выше). Давайте посмотрим, что произойдет с getUid()
, если использовать этот способ:
var getUid = function() {
var uid = 1;
return function() {
return uid++;
};
};
getUid()(); // 1
getUid()(); // 1
getUid()(); // 1
Тот же результат, как если бы не было никакой внутренней функции. Не очень полезно? Тем не менее, вы все равно можете воспользоваться вызовом функции оберточной несколько раз, если вам нужно создать несколько областей, но вы должны будете хранить внутренние функции в переменных:
var getUidA = getUid(); // scope A
var getUidB = getUid(); // scope B
getUidA(); // A 1
getUidA(); // A 2
getUidB(); // B 1
getUidA(); // A 3
getUidB(); // B 2
Я не уверен, что есть намного больше скажем, об основах закрытия, прокомментируют программисты-программисты. В любом случае, если вы чувствуете готовность к головным болям, вас может заинтересовать то, что происходит на низком уровне в памяти: https://stackoverflow.com/a/31778897/1636522.
Как у вас создалось впечатление, что вы «нуждаетесь» в кодовом коде? – Cerbrus
Это не * необходимо *.Это * демонстрация закрытия. – deceze
Вам не нужно это делать, если вам не нужно. Точно так же вам не нужно использовать 'Math.random', пока вам не понадобится случайное число. – zerkms