это не работает
function myCounter(){
let counter = 0;
function plus(){
counter++;
return counter;
}
return plus;
}
console.info(myCounter());
console.info(myCounter());но это работа
function myCounter(){
let counter = 0;
function plus(){
counter++;
return counter;
}
return plus;
}
var add = myCounter();
console.info(add());Я знаю, что они отличаются синтаксисом. Мой главный вопрос: Почему одна функция в console.info не работает и ее надо отнести к переменной
Обратите внимание, что ваш первый просто создает и возвращает функцию plus (дважды, так как вы вызываете ее дважды). На самом деле вы никогда не выполняете эту возвращаемую функцию, и вам не нужно назначение, которое вы могли бы сделать myfunction()(), хотя каждый раз, когда вы вызываете myfunction, вы получаете новую функцию и закрытую область видимости.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Во втором примере эта строка: var add = myCounter(); делает add переменную только ссылкой на функцию, если вы запишете в консоль добавленную переменную без квадратных скобок, она напечатает только [Function], но console.info(add()); вызовет функцию добавления.
Чтобы первый пример заработал, вы можете изменить оператор возврата функции счетчика myCounter.
Этот код заставляет myCounter возвращать только ссылку на функцию plus:
function myCounter(){
function plus(){
//code
}
return plus;
}
Поэтому, чтобы заставить его работать, вы должны дважды вызвать myCounter:
console.info(myCounter()());
Но это заставляет функцию plus вызываться, когда myCounter вызывается (вызывается) изнутри console.info(myCounter()):
function myCounter(){
function plus(){
//code
}
return plus();
}
Ваша функция myCounter возвращает только ссылку на функцию. Он не вызывает функцию plus.
В вашем первом примере вы вызываете только функцию myCounter:
console.info(myCounter());
В вашем втором примере вы сначала вызываете функцию myCounter, которая возвращает ссылку на функцию:
var add = myCounter();
а затем вы вызываете возвращаемую функцию:
console.info(add());
Решение:
Вы должны изменить эту строку
return plus;
к
return plus();
Это работает:
function myCounter(){
let counter = 0;
function plus(){
counter++;
return counter;
}
return plus();
}
console.info(myCounter());Вам не хватает концепции закрытие. Вызов функции myCounter вернет вам другую функцию и инициализирует «закрытую» переменную counter внутри, так что myCounter() -> function.
Конечно, вы можете вызывать так myCounter()(), но в этом случае "приватная" переменная counter будет инициализироваться при каждом вызове значением 0 и не будет полезна.
Решение состоит в том, чтобы сохранить результат myCounter() в переменной и вызвать ее позже, чтобы получить ожидаемое поведение.
function myCounter(){
let counter = 0;
function plus(){
counter++;
return counter;
}
return plus;
}
console.info(myCounter()());
console.info(myCounter()());
console.info(myCounter()());
console.info('====')
var add = myCounter();
console.info(add());
console.info(add());
console.info(add());
Что вы имеете в виду под отношением здесь?