В чём отличие вызова функции?
Прошу помочь разобраться.
У функции goCount есть ссылка не лексическое окружение - глобальное окружение, в котором находятся переменные:
result: 0,
goCount: function,
counter: function.
Переменной counter присваивается результат работы функции, т.е. возвращается увеличенное значение переменной - 1. И каждый последующий раз возвращается одно и то же значение - 1. Почему значение не увеличивается дальше?
// ПЕРВЫЙ ПРИМЕР
let result = 0;
function goCount() {
return ++result
}
// переменной присваивается результат функции
let counter = goCount();
counter; // 1
counter; // 1
counter; // 1
console.log(result) // 1
А вот, если убрать переменную counter и вызывать непосредственно саму функцию, тогда предыдущее значение функция запоминает:
// ВТОРОЙ ПРИМЕР
let result = 0;
function goCount() {
return ++result
}
goCount(); // 1
goCount(); // 2
goCount(); // 3
console.log(result) // 3
Выходит, что причина в переменной counter.
Что происходит, когда вызываем результат функции через эту переменную? Из-за чего именно всегда результат один и тот же?
Есть предположение, что из-за того, что переменной counter присваивается именно значение, то после того, как функция завершила свою работу - глобальное окружение удаляется, и при следующем вызове функции глобальное окружение рождается с начальными параметрами. А вот, если переменной присвоить именно ссылку на функцию:
// ТРЕТИЙ ПРИМЕР (равнозначен ВТОРОМУ)
let counter = goCount; // присваивается ссылка на функцию
counter(); // 1
counter(); // 2
counter(); // 3
...тогда глобальное окружение не сбрасывается, после завершения работы функции, поскольку в переменной есть функция, которая запомнила глобальное лексическое окружение, следовательно - результат работы функции (первый пример) в себе этого не хранит, поэтому и результат всегда один и тот же.
Ответы (2 шт):
let result = 0; // result = 0
function goCount() {
return ++result // вернуть result увеличить его на 1
}
let counter = goCount(); // вызвать goCount и ref на него, увеличили на 1
counter; // работаем с референсом result который был увеличен на 1
counter; // нечего не поменялось не с референсом не с переменной
counter; // нечего не поменялось не с референсом не с переменной
console.log(result) // выводим result который был равен 1 после вызова goCount
То-есть при переменная = переменная по сути ты же сам дал reference на result, который ты не меняешь. Ты же используешь let который имеет оптимизацию по референсам.
Так-же само во втором примере... Ты используешь в результате reference на result
=== Добавлено после комментария @Grundy ===
Какая к чёрту глобальная переменная... Ссылка (знак равно) на переменную в let становиться reference переменной вот хардкод с консоли. При чём там глобальные?!
let x = 1;
>> undefined
function incX() { x += 1 };
>> undefined
incX();
>> undefined
x
>> 2
=== Добавлено после обсуждений с @Grundy ===
Спасибо Grundy, за тыканье пальцем в слепого.
После обсуждений в чате, явно ошибка программирования находиться в 30 сантиметров от монитора.
// ПЕРВЫЙ ПРИМЕР
let result = 0;
function goCount() {
return ++result // увеличить result на 1 и вернуть (выполнение) в return
}
let counter = goCount(); // тут после вызова результат 1
counter; // counter не меняется равен 1
counter; // counter не меняется
counter; // counter не меняется
console.log(result) // result не меняется равен 1
В этом примере
// ВТОРОЙ ПРИМЕР
let result = 0;
function goCount() {
return ++result // Увеличить результат на 1 и вернуть (выполнение) в ретурн
}
goCount(); // 1 (Увеличил и вернул на 1 больше)
goCount(); // 2 (Увеличил и вернул на 1 больше)
goCount(); // 3 (Увеличил и вернул на 1 больше)
console.log(result) // 3 (Естественно он равен 3, ибо ты его три раза через ++ прогнал
Автору вопроса....
let x = 1;
console.log(++x);
> 2 // Потому что ты сначала добавил 1 к X потом вывел на экран
console.log(x++);
> 2 // Потому что ты начало вернул результат, потом вывел X на экран
x === 2 (true) потому что после того как ты вывел, ты увеличил.
В приведенном коде, значение result изменяется только при вызове функции.
В первом варианте функция вызывается один раз. Значение изменилось один раз.
Во втором и третьем - функция вызвалась три раза. Значение изменилось три раза.
Непонятно, почему в первом варианте, ожидалось, что значение дополнительно поменяется само по себе.