|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.06.2016, 00:33 | #1 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
[[Scope]],LE и замыкания в JS
Код:
Возникла небольшая проблема с логикой действий. Алерты поочередно показывают 1,2,3. И если первый Алерт, показывающий единицу мне понятен, то второй и третий так работать не должны. Значит, логика такая. 1)Первый counter получает ссылку на currentCount внешней функции, видит, что currentCount присвоена единица и забирает эту единицу себе и так как инкремент находится в постфиксной форме, Алерт выводит на экран не двойку, а единицу. 2)Второй counter получает ссылку на currentCount, видит, LE currentCount == 1 и забирает эту единицу себе. По идее второй Алерт тоже должен выдать единицу, ибо во внешнем LE currentCount == 1. Я так понимаю между 1 и 2 пунктом происходит некая перезапись currentCount в внешнем LE. Вопрос такой: Как эта перезапись происходит и перезапись ли это вообще? |
18.06.2016, 01:39 | #2 |
Раздолбайских Дел
Старожил
Регистрация: 22.05.2009
Сообщений: 3,828
|
не знаю, что такое LE, может я не очень программер... но тут у тебя makeCounter — это функция со своей областью видимости, currentCount в ней создается при вызове и возвращается функция, которая будет юзать то внутреннее поле...
Код:
Можешь сделать Код:
Alar, верни репу!
|
18.06.2016, 11:05 | #3 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Спасибо. Я понимаю, как происходит замыкание, и что происходит при присвоении var counter = makeCounter();
Не понятно, как counter может изменять переменную не своего внутреннего поля, а внешнего поля makeCounter(). Т.е. currentCount при каждом вызове counter() так и должна оставаться единицей. Почему она перезаписывается с каждым вызовом counter()? |
18.06.2016, 11:38 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Потому что замыкания так работают, а не так как вы придумали.
Что такое LE?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
18.06.2016, 11:46 | #5 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
LE - Lexical Environment, термин из учебника. Объект функции, который включает в себя все внутренние переменные функции и [[Scope]]
|
18.06.2016, 11:48 | #6 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
|
18.06.2016, 12:45 | #7 | |
Раздолбайских Дел
Старожил
Регистрация: 22.05.2009
Сообщений: 3,828
|
Цитата:
Все просто.
Alar, верни репу!
|
|
18.06.2016, 14:15 | #8 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
|
18.06.2016, 14:19 | #9 |
Старожил
Регистрация: 12.11.2010
Сообщений: 8,568
|
Коротко смысл замыканий можно объяснить так.
Каждая вложенная функция видит переменные своих объемлющих функций (если эти вложенные функции не перекрывают их путём объявления их инструкцией var), то есть область видимости (scope) распространяется вглубь по функциям. Это значит, что переменная mySuperVar, объявленная во внешней программе, вне всяких функций будет видна: 1. внутри функции f, которая объявлена внутри основной программы; 2. Внутри функции g, объявленной внутри функции f, которая объявлена во внешней программы; 3. Внутри функции h, которая объявлена внутри функции g, которая объявлена внутри функции f, которая объявлена в основной программе... И так далее. Теоретически это так, хотя не стоит использовать глобальные переменные внутри функций, это плохой подход. Если, допустим, мы внутри функции f объявили ЛОКАЛЬНУЮ переменную innerVariable, то такая переменная будет видна внутри функций f (что очевидно), g и h, но не во внешней программе. |
18.06.2016, 14:27 | #10 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Черт. Все же просто. Внутренняя функция изменяет переменные внешней функции точно так же, как внешняя изменила бы обычную глобальную переменную. По тому же принципу. Все ясно. Черт. Это был действительно тупой вопрос. Спасибо
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
адаптер замыкания на себя | kral123 | Свободное общение | 2 | 15.02.2013 16:46 |
Замыкания и setTimeout | Виталий Желтяков | JavaScript, Ajax | 7 | 26.01.2012 13:16 |
abc was not declared in this scope | Farrel | Qt и кроссплатформенное программирование С/С++ | 2 | 21.04.2011 17:56 |
error: was not declared in this scope | Serjuk | Помощь студентам | 2 | 29.03.2011 15:59 |
Замыкания | Viconte | JavaScript, Ajax | 1 | 07.11.2010 21:08 |