Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос по задаче JS

Виктор Леонов Гуру (2530), на голосовании 1 год назад
Почему при данном вызове мы получаем count = 3, но если мы вынесем message выше функции log , у нас она будет при вызове 0 . При вызове функции log мы же ссылаемся все-равно на лексическое окружение родителя , в котором count уже должен быть увеличен после вывоза трех раз increment ?
Голосование за лучший ответ
Matz Просветленный (36096) 1 год назад
Если message вынести из окружения функции log то значение 0 будет присвоено этой переменной только один раз при ЕДИНСТВЕННОМ запуске функции createIncrement()
Виктор ЛеоновГуру (2530) 1 год назад
но у нас перед этим три раза increment() вызвался , который count увеличил, и когда message в окружении log находится, то приходит тройка . то почему если выносим ЗА log , у нас идёт 0 . т.к при вызове функции log переменную она не должна найти у себя, и взять уже увеличенную в родительском окружении

в общем не понятно , что меняется если log будет брать если у себя не найдет ту же переменную , только в другом окружении . хотя перед этим мы вызываем increment()
Matz Просветленный (36096) Виктор Леонов, то что increment 3 раза увеличил count не означает что переменная message 3 раза обновилась, это тебе не стейт в React, тут реактивности нет. переменная message, когда она вне log() получает значение только один раз при запуске createIncrement() и всё. А вот когда она внутри log() то получает значение еще и при запуске log()
Dmitry Оракул (62522) 1 год назад
Разница здесь в том когда именно было присвоено значение переменной message.

Например когда присвоение значения идет в функции log, которая вызывается после трех вызовов функции increment, то в переменной count уже значение 3

А когда мы выносим строчку с message из функции log, то присваивание ей значения происходит в момент вызова функции createIncrement и соответственно её значение на этот момент равно 0, а после трех раз increment лишь обновляется значение переменной count, но не message.
Виктор ЛеоновГуру (2530) 1 год назад
все-равно кажется не логичным то, что message в любом случае ссылается на count и при третьем вызове он 0 ) . в log он плюсует логично . а когда переменная в главной функции то почему то записывается только первый раз. хотя вызывается это всё после счетчика.
Dmitry Оракул (62522) Виктор Леонов, потому что значение переменной устанавливается до того, как в count будут изменения после выполнения функции increment. Во время присваивания значения переменной message, значение переменной count равно 0, ведь на момент вызова функции createIncrement, еще ни разу не была вызвана функция increment, она была только что определена, но не вызвана. Все как раз таки логично и понятно.
Павел Просветленный (25618) 1 год назад
Потому что в message хранится обычная строка которая сформирована в момент инициализации переменной. Вызвав log, message каждый раз инициализируется заново. За пределы log - всего 1 раз.
Похожие вопросы