2015-02-17 3 views
0

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

Я играю с этим и выполняю упражнение, в котором переменную (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 

Что именно происходит каждый раз, когда эта конструкция называется, мы можем идти шаг за шагом и следовать за потоком?

Ниже приведены некоторые из моих мыслей & предположения, дайте мне знать, если те ошибаются:

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

  2. Однако поведение, похоже, не меняется, если вместо этого я просто запускаю console.log (sumFunc (2,3));

  3. Я возвращаю subFunction в конце специально, поскольку я нахожусь в начале исследования и хочу сохранить все как можно проще. Я понимаю, что я, вероятно, мог бы вернуть анонимную функцию (return function()), которая затем вернет d, но я избегаю этого в этот момент времени. Как я вижу, этот код делает абсолютно то же самое, но я чувствую, что это более ясно для меня, и я лучше контролирую его.

  4. Я столкнулся с тем, что функции самозапускания могут помочь, но я не хочу использовать их здесь (допустим, это не часть моего проекта, чтобы немедленно сменить счетчик).

+0

Это помогает .. http://jsfiddle.net/wtbajx1q/1/? –

+0

Вызов 'return subFunction();' вы на самом деле * вызываете * 'subFunction' и возвращаете его результат (что составляет 15 для исходных аргументов' 2,3'). – haim770

+0

@ Rakesh_Kumar да, это работает, но здесь у нас есть анонимная функция, которую я пытался избежать (см. Пункт 3 в моем объяснении). – Vadimster

ответ

0

3. Я возвращаю subFunction в конце по назначению. Вы возвращаете результат подфункции. Для возврата функции вам нужно вернуть subFunction; без скобок.

После этого вам необходимо вызвать его, поэтому console.log (result());

Исполнение с вызовом функции

var sumFunc = function(a,b){ 
var c = a+b; 
var e = 10; 
function subFunction(){ 
    var d = c + e; 
    e++; 
    return d;   
} 
return subFunction();//function call 
}; 

var result = sumFunc(2,3);//call sumFunc and imidiately call subFunction 
//result contains 15, not pointer to function 
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 

версия с функцией указателя

var sumFunc = function(a,b){ 
var c = a+b; 
var e = 10; 
function subFunction(){ 
    var d = c + e; 
    e++; 
    return d;   
} 
return subFunction;//return function pointer 
}; 

var result = sumFunc(2,3);//call sumFunc and return pointer to subFunction 
//result contains pointer to function 
console.log(result()); //15 call function in result 
console.log(result()); //16 
console.log(result()); //17 
console.log(result()); //18 
+0

Право, которое меня очень смутило:/ – Vadimster

2

Проблема в том, что вы вызываете обратный подфункции(); который в основном возвращает значение. Поэтому, независимо от количества раз, когда вы регистрируете результат, он будет таким же, а не тем, что вы можете сделать.

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()); //16 
console.log(result()); //17 
console.log(result()); //18 
+0

Я чувствую, что мне нужно прояснить его здесь и хорошо понять, что происходит шаг за шагом. Вы говорите «что в принципе возвращает значение». Итак, значение этой функции - 'd'. НО эта функция также увеличивает 'e'! Или вы пытаетесь сказать, что я на самом деле не выполняю ** эту функцию и ** не ** увеличиваю 'e'? Это неверно, поскольку я вижу, что 'e' увеличивается, поэтому его новое значение должно быть сохранено. Было бы полезно, если бы мы могли шаг за шагом следить за тем, как JS интерпретирует эту структуру. Я действительно потерялся здесь. – Vadimster

+0

Я хочу сказать, что когда вы возвращаете subFunction(), он вызывает метод subFunction, и значение d возвращается окончательно. Переменная результата SO будет иметь это значение d. Если вы снова напечатаете, значение будет одинаковым постоянным значением, это не метод, который вызывается. И в моем ответе я возвращаю ссылку на функцию, поэтому результат имеет эту функцию, которую вы можете вызвать снова и снова, чтобы выполнить ее. – Vaibhav

Смежные вопросы