Функции Javascript (из замыкания) - PullRequest
0 голосов
/ 19 мая 2018

У меня есть этот код (приведенный ниже), и когда я пишу c1 = count();, я вызываю функцию count() (мое текущее понимание), поэтому замыкание запоминает c = 1 после первого вызова.

Позже, если я вызову c1(), результат будет равен 1. Почему получается, что результат равен 1, если, когда я однажды вызвал эту функцию, написав c1=count(), c уже был увеличен до 1?Не должно ли значение быть 2?

function count() {
    var c = 0 ;
    return function() {
        c += 1 ;
        return c ;
    };
}

Если нет,

Почему, когда я пишу эту функцию, у меня выводится «A!»?Это означает, что при написании var x=a() я вызываю функцию, та же логика должна использоваться в функции выше, не так ли?

function a() {
  alert('A!');
  return function() {
    alert('B!');
  };
};
var x = a();

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Когда вы вызываете count, вы возвращаете внутреннюю функцию из count, которую вы храните в c1:

return function() {
  c += 1 ;
  return c ;
};

Но в то время вы не вызывали эту возвращаемую функцию, поэтомуc по-прежнему 0.

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

function count() {
  console.log('var c=0')
  var c = 0;


  console.log('return function () { ...  }')
  return function() {
    console.log('c += 1')
    c += 1;
    console.log('return c')
    return c;
  };
}

console.log('var c1 = count()')
var c1 = count();

console.log('c1()')
console.log(c1())
console.log('c1()')
console.log(c1())
0 голосов
/ 19 мая 2018

здесь ваша функция,

function count() {  
 var c = 0 ;
 return function() {
   c += 1 ;
   return c ;
 };
}

при первом вызове функции count() она выполняет 2 действия,

  1. Инициализация var c
  2. возвращает функцию, которая содержит ссылку на переменную c, которая была объявлена ​​во внешней области видимости.(Узнайте больше о замыкании: это хорошая статья https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36)

Теперь возвращаемое значение count(), т. Е. Функция возврата назначена переменной c1. C1 - функциякоторый при вызове увеличивает значение переменной c.

, когда вы делаете,

var c1 = count(); // c = 0 & a function is assigned to c1
c1(); // c + 1 i.e 1
c1(); // c = 2

и т. д.

Теперь следующий случай,

function a() {
  alert('A!');
  return function() {
    alert('B!');
  };
};
var x = a();

при вызове a()

  1. alert('A!')
  2. возвращает функцию и присваивает ей x;

в следующий раз, когда вы позвоните x(), он всегда будет alert('B!')

Надеюсь, это поможет.

0 голосов
/ 19 мая 2018
function count() {

   var c = 0 ;
   return function() {
     c += 1 ;
     return c ;
    };
}

Каждый раз, когда вы вызываете эту функцию, вы устанавливаете значение на 0 - так что оно всегда будет возвращать единицу.Вместо этого вызовите его счетчик приращений и передайте значение, которое будет увеличиваться в:

function incrementCount(valToInc) {
   return valToInc += 1;
}

incrementCount(4); //returns 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...