Size: a a a

2019 December 01

T

Theo in JS
Ага
источник

T

Theo in JS
Только еще она "знает", что count изначально 0
источник

W

WwW in JS
так. вот мы вызываем внешнюю функцию и записываем результат в переменную counter1. теперь чтобы вызвать внутреннюю переменную мы пишем counter1(). counter1 у нас как бы глобальное окружение для этих функций в данном случае. но почему тогда нельзя сразу вызвать внутреннюю функцию в глобальном окружении и она не будет так же запоминать изменения переменной во внешней функции? я имею в виду способ makeCounter()(). без использования глобального окружения, которое даёт нам переменная counter1
источник

T

Theo in JS
Что нахуй?
источник

T

Theo in JS
Можно поэтапно и более понятно для людей?
источник

T

Theo in JS
с момента "но почему тогда нельзя..."
источник

W

WwW in JS
так. вопрос вот в чём. почему нам надо записывать результат вызова внешней функции в переменную, чтобы потом вызвать внутренню функцию? почему в примере счётчик в этом случае работает?

Почему нельзя вызвать внутреннюю функцию makeCounter()(), чтобы точно так же менялась и запоминались значения count во внешней функции?
источник

T

Theo in JS
В какой внешней функции? При вызове makeCounter()() тебе не возвращается функция
источник

T

Theo in JS
Тебе просто возвращается число и все
источник

W

WwW in JS
да
источник

T

Theo in JS
Ага
источник

W

WwW in JS
при counter1() тоже возвращается число. но при повторном вызове оно увеличивается, а при повторном вызове makeCounter()() нет.
источник

T

Theo in JS
Потому что каждый вызов функции makeCounter() возвращает новое лексическое окружение
источник

V

Vermin in JS
@What_a_W0nderfu1_W0r1d у функций есть:
а) собственное лексическое окружение, в котором записаны переменные.
б) скрытое свойство scope, в котором содержится ссылка на внешнее лексическое окружение.

let counter1 = makeCounter() передает в переменную counter1 анонимную функцию с инкрементированием переменной count.
Анонимная функция имеет свойство scope, которое содержит ссылку на лексическое окружение, в котором та была создана (т .е. на makeCounter) и запоминает его.
Потом, ты вызываешь АНОНИМНУЮ ФУНКЦИЮ (!!!) с помощью переменной count1 -- count1(), вот так. Функция ищет в своем лексическом окружении переменную count, не находит и обращается через scope к лексическому окружению на уровень выше, т.е. к самой makeCounter, в котором ее находит.
Scope makeCounter'а, кстати, ссылается на window, и, если не находит переменную в своем окружении, может взять ее снаружи, прямо глобальную, да.
источник

T

Theo in JS
В одном случае ты привязываешь его к переменной и работаешь с ним
источник

T

Theo in JS
А, ну вот тебе и расписали
источник

В

Валик in JS
WwW
при counter1() тоже возвращается число. но при повторном вызове оно увеличивается, а при повторном вызове makeCounter()() нет.
при makeCounter()() ты каждый раз создаешь новую функцию, которая берет переменные из доступного ей скоупа, а при counter1() ты вызываешь одну и ту же функцию, которая берет переменные из замкнутого скоупа
источник

W

WwW in JS
Vermin
@What_a_W0nderfu1_W0r1d у функций есть:
а) собственное лексическое окружение, в котором записаны переменные.
б) скрытое свойство scope, в котором содержится ссылка на внешнее лексическое окружение.

let counter1 = makeCounter() передает в переменную counter1 анонимную функцию с инкрементированием переменной count.
Анонимная функция имеет свойство scope, которое содержит ссылку на лексическое окружение, в котором та была создана (т .е. на makeCounter) и запоминает его.
Потом, ты вызываешь АНОНИМНУЮ ФУНКЦИЮ (!!!) с помощью переменной count1 -- count1(), вот так. Функция ищет в своем лексическом окружении переменную count, не находит и обращается через scope к лексическому окружению на уровень выше, т.е. к самой makeCounter, в котором ее находит.
Scope makeCounter'а, кстати, ссылается на window, и, если не находит переменную в своем окружении, может взять ее снаружи, прямо глобальную, да.
хорошо))) вызов makeCounter()() вызвает анонимную функцию. она ищет переменную у себя и не находит. идёт выше. там эта переменная = 0. находит и возвращает нам 0.

далее  мы опять делаем makeCounter()() и происходит тоже самое

Теперь поместим анонимную функцию в counter1. вызываем counter1(). происходит всё то же самое, что в первом абзаце.

далее мы опять делаем counter1(), но происходит совсем не так как при втором makeCounter()(). ведь результат увеличивается.

Это происходит потому, что вызывая makeCounter()() два раза происходит совершенно два обособленных вызова. Так почему же при вызове counter1() два раза не получается тоже самое? ведь это точно такой же вызов анонимной переменной, которая точно так же пытается найти count у себя, не находит и идёт выше.
источник

T

Theo in JS
Потому что она в своем скоупе видит count, который был инкрементирован прошлым вызовом
источник

V

Vermin in JS
WwW
хорошо))) вызов makeCounter()() вызвает анонимную функцию. она ищет переменную у себя и не находит. идёт выше. там эта переменная = 0. находит и возвращает нам 0.

далее  мы опять делаем makeCounter()() и происходит тоже самое

Теперь поместим анонимную функцию в counter1. вызываем counter1(). происходит всё то же самое, что в первом абзаце.

далее мы опять делаем counter1(), но происходит совсем не так как при втором makeCounter()(). ведь результат увеличивается.

Это происходит потому, что вызывая makeCounter()() два раза происходит совершенно два обособленных вызова. Так почему же при вызове counter1() два раза не получается тоже самое? ведь это точно такой же вызов анонимной переменной, которая точно так же пытается найти count у себя, не находит и идёт выше.
Функция запоминает скоуп
источник