![]() |
|
||||||||||
|
|||||
|
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Вы даже не знаете как цикл работает?
|
|
|||||
|
Регистрация: May 2014
Сообщений: 3
|
|
|
|||||
|
Эмм, народ, stepa232 на самом деле столкнулся с кривой реализацией примитивов и областей видимости в Flash Player. Давайте я поясню проблему кода из первого поста, смотрите:
while(i<=10) { bt_head[i].addEventListener(MouseEvent.CLICK, function(){buyItem(head[i]);}); i++; } - что нам вернет эта конструкция? Она вернет нам i-тый элемент массива. Сейчас читайте внимательно. На каждой итерации цикла мы делаем следующее 1) берем переменную i 2) берем у переменной i ее текущее значение 3) берем массив bt_head 4) запрашиваем у массива элемент с номером, равным значению i Зачем я так подробно все это расписываю? Затем что следующее использование аналогичной конструкции работает совсем по-другому. Смотрим: Итак, имеем функцию. Функция тоже использует нашу переменную i, но почему-то в функции наша i всегда имеет одинаковое значение! Почему?! А все просто. Потому что функция не выполняется внутри цикла, она создается внутри цикла. А выполняется она всегда строго после того, как цикл закончился. А когда цикл закончился, i имеет значение с последней итерации (что логично). Разбираем по пунктам, что делается на каждой итерации цикла: 1) Создаем новую безымянную функцию 2) Создаем код новой функции - взять переменную i - взять у i ее текущее значение - взять массив head - ну и дальше все как в прошлый раз 3) Нашу свежую функцию передаем в метод addEventListener в качестве аргумента. Видите? Вся проблема в словах текущее значение. В ActionScript переменная i почему-то не просто число, а объект, контейнер, у которого можно спросить его значение. И это большая проблема в таких вот замыканиях. Но есть и решение. Оно некрасивое и неудобное в общем-то. Но оно есть. Нужно создать для каждой функции свой собственный контейнер для числа. Очень грубо это будет выглядеть вот так: Вот что тут происходит - когда мы передаем i в getClickListener, создается новый контейнер для числа. Копирование "простых" типов всегда происходит при передаче в новую область видимости. И, соответственно, в новом контейнере всегда хранится именно то значение, что нам нужно. То что было в i на момент итерации цикла.
__________________
...вселенская грусть |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Gerbert, честно говоря Вы немного поднадоели. Человек не имеет права не знать как работает цикл?
А если он не знает, то он удостоен Вашего содержательного ответа? Идите пишите игры, программы, иначе у Вас будет социопатия. |
|
|||||
|
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Цитата:
P.S. Ссылка неактивна, я не знаю, как у вас там все построено |
|
|||||
|
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Цитата:
|
|
|||||
|
Gerbert, я думаю MikroAcse хотел сказать Вам следующее, что просто нет смысла понукать кого либо в незнании чего либо. Раз человек спрашивает, значит он не знает, иначе он бы и не спрашивал правда? Просто например сообщения вида: "Как вы этого не знаете?" - не несут никакого полезного свойства, они не помогают ни тому, кому нужна помощь, ни Вам, а лишь засоряют тему от начавшихся обоюдных, словесных перепалок.
Я ни в коем случае не пытаюсь "поставить Вас на место", просто хочу показать эту ситуацию со стороны. |
|
|||||
|
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
samana, я понимаю, что со стороны это может выглядеть,
как грубость или неадекватность.. Но дело в том, что я не вкладываю в слова отрицательных эмоций, когда пишу их. Можно было написать -"нет" и это было бы равнозначно, но почему-то я написал так. Возможно меня задело то, что показав человеку код, он ещё спрашивает - "а работает ли он", вместо того, чтобы попробовать. В общем, я больше так не буду ![]() |
|
|||||
|
Регистрация: Jan 2013
Сообщений: 322
|
while(i<=10){ with({i: i}) bt_head[i].addEventListener(MouseEvent.CLICK, function(){buyItem(head[i]);}); i++; } Цитата:
другое дело место хранения переменной |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:28. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|