В чем причина отношения функции к переменной? - PullRequest
1 голос
/ 21 апреля 2019

это не работает

function myCounter(){
	let counter = 0;
    function plus(){
        counter++;
        return counter;
    }
    return  plus;
}

console.log(myCounter());
console.log(myCounter());

но эта работа

function myCounter(){
	let counter = 0;
    function plus(){
        counter++;
        return counter;
    }
    return  plus;
}
var add = myCounter();

console.log(add());

Я знаю, что они отличаются по синтаксису. Мой главный вопрос: Почему одна функция console.log не работает и должна быть отнесена к переменной

Ответы [ 3 ]

1 голос
/ 21 апреля 2019

Ваша функция myCounter возвращает только ссылку на функцию. Он не вызывает функцию plus.

В вашем первом примере вы вызываете только функцию myCounter:

console.log(myCounter());

Во втором примере вы сначала вызываете функцию myCounter, которая возвращает ссылку на функцию:

var add = myCounter();

и затем вы вызываете возвращенную функцию:

console.log(add());

Решение:

Вы должны изменить эту строку

return plus;

до

return plus();

Это работает:

function myCounter(){
    let counter = 0;
    function plus(){
        counter++;
        return counter;
    }
    return plus();
}

console.log(myCounter());
0 голосов
/ 21 апреля 2019

Вам не хватает концепции замыкания .Вызов функции myCounter вернет вам другую функцию и инициализирует внутреннюю переменную counter, поэтому myCounter() -> function.

Конечно, вы можете вызвать этот путь myCounter()(), но в этом случае «приватная» переменная counter будет инициализироваться при каждом вызове со значением 0 и не будет полезна.

Решение состоит в том, чтобы сохранить результат myCounter() в переменной и вызвать его позже, чтобы у вас было ожидаемое поведение.

function myCounter(){
  let counter = 0;
  function plus(){
    counter++;
    return counter;
  }
  return  plus;
}

console.log(myCounter()());
console.log(myCounter()());
console.log(myCounter()());

console.log('====')

var add = myCounter();
console.log(add());
console.log(add());
console.log(add());
0 голосов
/ 21 апреля 2019

Во втором примере эта строка: var add = myCounter(); делает add var только ссылкой на функцию, если вы запишете add add без скобок, она напечатает только [Function], ноconsole.log(add()); заставляет вызывать функцию добавления.

Чтобы первый пример работал, вы можете изменить оператор возврата функции счетчика myCounter.

Этот код делаетmyCounter для возврата только ссылки на функцию plus:

function myCounter(){
    function plus(){
        //code
    }
    return  plus;
}

Поэтому, чтобы заставить ее работать, вы должны дважды вызвать myCounter:

console.log(myCounter()());

Но этозаставить функцию plus вызываться при вызове (10) myCounter изнутри console.log(myCounter()):

function myCounter(){
    function plus(){
        //code
    }
    return plus();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...