Замыкание в цикле
Здравствуйте!
Скажите пожалуйста правильный ли такой код? 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)} );
}
}
Спасибо! |
HJ90,
:write:
for (var i = 0; 2 > i; i++)(function (a) {
placemark[a].events.add("click", function () {
alert(a)
})
})(i);
|
рони, спасибо!
Но здесь тоже 2 раза создается анонимная функция. Это плохо если нужно перебирать большой цикл... Или я не прав? |
Цитата:
тогда создание отдельной функции для него - капля в море, нет смысла заморачиваться. |
Цитата:
Да, это метка на яндекс карте. Обычно будет создаваться 10-20 меток, Но возможна ситуация когда будет и 1000. |
попробуй такой вариант, вдруг прокатит:
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 |
Яростный Меч, не работает пример...
Я вот тоже так хотел. Но внутри function уже не видно локальную "i" Оно берет значение со scope, а там i = 1 |
На хабре есть такой пример.
Только у меня он почему-то не работает. 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;
}
}
|
HJ90,
внутри обработчика должен быть способ достать тот элемент, на котором случился клик. вот, покури http://api.yandex.ru/maps/doc/jsapi/...pts/events.xml скорее всего, e.get('target') - оно самое e - объект, который передается первым параметром в хендлер. |
Яростный Меч
Да нет, это не то) e.get ('target') вернет ссылку на метку по которой кликнули а мне здесь нужно создать массив меток и присвоить им эвенты Но всеравно спасибо! :) |
for(var i=0; i < 2; i++){
placemark[i].events.add('click', new Function("", "alert("+i+");"));
}
Десятитысячный цикл у меня перебрал без проблем. На ста тысячах на пол секунды затормозил. |
Erolast, не нравится мне new Function как и еval :)
Наверное сделаю как рони писал выше. |
| Часовой пояс GMT +3, время: 14:01. |