Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкание в цикле (https://javascript.ru/forum/misc/41844-zamykanie-v-cikle.html)

HJ90 01.10.2013 13:32

Замыкание в цикле
 
Здравствуйте!
Скажите пожалуйста правильный ли такой код?
Cломал уже голову c этим замыканием )
Код рабочий, но пока ничего лучшего не получилось.

Мне нужно чтобы в function(){alert(i)} записывалось текущее значение "i"

for(var i=0; i < 2; i++){
	func(i);
	function func(i){
		placemark[i].events.add('click', function(){alert(i)} );
	}
}

Спасибо!

рони 01.10.2013 14:02

HJ90,
:write:
for (var i = 0; 2 > i; i++)(function (a) {
    placemark[a].events.add("click", function () {
        alert(a)
    })
})(i);

HJ90 01.10.2013 14:28

рони, спасибо!
Но здесь тоже 2 раза создается анонимная функция.
Это плохо если нужно перебирать большой цикл...
Или я не прав?

Яростный Меч 01.10.2013 14:37

Цитата:

Сообщение от HJ90
Но здесь тоже 2 раза создается анонимная функция.
Это плохо если нужно перебирать большой цикл...

а что такое "placemark"? объект на яндекс-карте?
тогда создание отдельной функции для него - капля в море, нет смысла заморачиваться.

HJ90 01.10.2013 14:49

Цитата:

Сообщение от Яростный Меч (Сообщение 274551)
а что такое "placemark"? объект на яндекс-карте?
тогда создание отдельной функции для него - капля в море, нет смысла заморачиваться.


Да, это метка на яндекс карте.
Обычно будет создаваться 10-20 меток,
Но возможна ситуация когда будет и 1000.

Яростный Меч 01.10.2013 14:55

попробуй такой вариант, вдруг прокатит:

function pmClick() {
    alert(this.value_i);
}
for(var i=0; i < 2; i++){
    placemark[i].value_i = i;
    placemark[i].events.add('click', pmClick );
}


т.е. к каждой метке прикрепить значение i, потом в хендлере получить его как-то через this

HJ90 01.10.2013 15:14

Яростный Меч, не работает пример...
Я вот тоже так хотел.
Но внутри function уже не видно локальную "i"
Оно берет значение со scope, а там i = 1

HJ90 01.10.2013 15:36

На хабре есть такой пример.
Только у меня он почему-то не работает.
http://habrahabr.ru/post/137318/

function addEvents2(divs) {
    var f=function f(){alert(this.$i)};
    for(var i=0; i<divs.length; i++) {	
        divs[i].innerHTML = i;
        divs[i].$i=i;
        divs[i].onclick = f;
    }
}

Яростный Меч 01.10.2013 16:05

HJ90,

внутри обработчика должен быть способ достать тот элемент, на котором случился клик.

вот, покури http://api.yandex.ru/maps/doc/jsapi/...pts/events.xml
скорее всего, e.get('target') - оно самое
e - объект, который передается первым параметром в хендлер.

HJ90 01.10.2013 16:48

Яростный Меч
Да нет, это не то)
e.get ('target') вернет ссылку на метку по которой кликнули
а мне здесь нужно создать массив меток и присвоить им эвенты
Но всеравно спасибо! :)


Часовой пояс GMT +3, время: 18:18.