С чем связано отношение функции к переменной?

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

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 не работает и ее надо отнести к переменной

Что вы имеете в виду под отношением здесь?

Barmar 21.04.2019 12:59

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

Patrick Evans 21.04.2019 13:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Во втором примере эта строка: 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());

Другие вопросы по теме