Я увлечен концепцией сохранения и повторного использования локальной переменной даже после того, как функция выполняет и завершает работу, и это достигается простой архитектурой кода (область охвата).Приращение и сохранение «частной» переменной с помощью замыканий
Я играю с этим и выполняю упражнение, в котором переменную (var e) следует увеличивать и повторно использовать в следующий раз. Это увеличивает в конце концов, однако, она не сохраняется и возвращается к 10.
var sumFunc = function(a,b){
var c = a+b;
var e = 10;
function subFunction(){
var d = c + e;
e++;
return d;
}
return subFunction();
};
var result = sumFunc(2,3);
console.log(result); //15
console.log(result); //15 instead of 16
console.log(result); //15 instead of 17
console.log(result); //15 instead of 18
Что именно происходит каждый раз, когда эта конструкция называется, мы можем идти шаг за шагом и следовать за потоком?
Ниже приведены некоторые из моих мыслей & предположения, дайте мне знать, если те ошибаются:
Я ссылается на функцию через переменную, чтобы исключить вероятность этой переменной будет garbaged. Я боюсь сборщика мусора, я думаю, это то, что они говорят непослушным программистам перед сном.
Однако поведение, похоже, не меняется, если вместо этого я просто запускаю console.log (sumFunc (2,3));
Я возвращаю subFunction в конце специально, поскольку я нахожусь в начале исследования и хочу сохранить все как можно проще. Я понимаю, что я, вероятно, мог бы вернуть анонимную функцию (return function()), которая затем вернет d, но я избегаю этого в этот момент времени. Как я вижу, этот код делает абсолютно то же самое, но я чувствую, что это более ясно для меня, и я лучше контролирую его.
Я столкнулся с тем, что функции самозапускания могут помочь, но я не хочу использовать их здесь (допустим, это не часть моего проекта, чтобы немедленно сменить счетчик).
Это помогает .. http://jsfiddle.net/wtbajx1q/1/? –
Вызов 'return subFunction();' вы на самом деле * вызываете * 'subFunction' и возвращаете его результат (что составляет 15 для исходных аргументов' 2,3'). – haim770
@ Rakesh_Kumar да, это работает, но здесь у нас есть анонимная функция, которую я пытался избежать (см. Пункт 3 в моем объяснении). – Vadimster