Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сделать цикл, ну сделать цикл.... чего тут ещё писать 
V
    Опции темы
butionok
Дата 7.3.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 19.1.2005

Репутация: 1
Всего: 3



Приветствую всех!

Никак ни могу загнать следующие строчки в цикл.
Код

obj.buffers.onload[0]=function(){obj.buffers.load[0]=1};
obj.buffers.onload[1]=function(){obj.buffers.load[1]=1};
obj.buffers.onload[2]=function(){obj.buffers.load[2]=1};
obj.buffers.onload[3]=function(){obj.buffers.load[3]=1};
obj.buffers.onload[4]=function(){obj.buffers.load[4]=1};


и знаю почему. smile Только от этого не легче. 
Давайте договоримся, что писать будем по существу. И вопросы "зачем?", "почему?", "может тебе это не надо?","может ты в логике ошибаешься?"..... пожалуйста не задавайте. От них нет никакого толку, только пустой флуд.
--------------------
Ненавижу убогую Оперу.
PM MAIL ICQ   Вверх
Mymik
Дата 7.3.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 11
Всего: 78



Код

for(i = 0; i < obj.buffers.onload.length; i++)
     obj.buffers.onload[i] = function(){obj.buffers.load[i] = i;};



--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
AKS
Дата 7.3.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Mymik, ни в чем себе не отказываете в "Lamer-центере", да?  smile  smile  smile 

butionok, надо как-нибудь так:
Код

var buff = obj.buffers,
    on = buff.onload,
    ld = buff.load,
    i = on.length;
while (i--) {
    on[i] = function (o, k) {
        return function () { o[k] = k; };
    }(ld, i); 
     /* или так:  new Function('obj.buffers.load[' + i + '] = ' + i);  */
};

PM MAIL   Вверх
Zeroglif
Дата 7.3.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Mymik
butionok,

Развивая недосказанное AKS-ом, чтоб стало понятнее на более условном примере:

Код

//-> создаём объект, у него 3 свойства (тоже объекты)
var o = {0:{}, 1:{}, 2:{}};

//-> обходим свойства (объекты) и к каждому цепляем метод
(function () {
    for (var i in o) {
        o[i].click = function () {alert(i)};
    }
})();

//-> пообъектно вызываем метод click
o[0].click(); //-> 2
o[1].click(); //-> 2
o[2].click(); //-> 2 

Как видно, функция (замыкание) не запоминает значение i в момент своего создания, всё, что она может - это обратиться к этой переменной по имени, чтобы получить её текущее (последнее) значение, а текущим значением i при выходе из основной функции является 2, одно единственное значение для всех замыканий. Чтобы каждое замыкание имело своё независимое значение, нужно на каждом витке каким-либо способом его "сохранить", например:

Код

//-> Решение 1

(function () {
    for (var i in o) {
        o[i].click = function (i) {
            return function(){alert(i)};
        }(i);
    }
})();

o[0].click(); // 0
o[1].click(); // 1
o[2].click(); // 2



//-> Решение 2

(function () {
    for (var i in o) {
        with ({i : i})
            o[i].click = function () {
                alert(i);
            }
    }
})();

o[0].click(); // 0
o[1].click(); // 1
o[2].click(); // 2



//-> Решение 3

(function () {
    for (var i in o) {
        o[i].v = i;
        o[i].click = function () {
            alert(this.v);
        }
    }
})();

o[0].click(); // 0
o[1].click(); // 1
o[2].click(); // 2



//-> Решение 4

(function () {
    for (var i in o) {
        (o[i].click = function () {
            alert(arguments.callee.v);
        }).v = i;
    }
})();

o[0].click(); // 0
o[1].click(); // 1
o[2].click(); // 2



//-> и так далее в том же направлении... на свой вкус...

PM MAIL WWW   Вверх
butionok
Дата 7.3.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 19.1.2005

Репутация: 1
Всего: 3



Mymik!! Слабо было попробовать? а ведь не работает!!! Разъясняю почему:

Допустим:
Код

for(l=0;l<5;l++)
      obj.buffers.onload[l]=function(){
                                        obj.buffers.load[l]=l;
                                        alert(obj.buffers.load[l]); // собственно проверяем
                                                      };

теперь проверяем:
Код

for(k=0;k<5;k++)
    alert(obj.buffers.onload[k]);

Алерт естественно выдаёт: "function(){obj.buffers.load[l]=l;alert(obj.buffers.load[l]);}"
Вопрос в том где будут функции брать "l"?
Проверяем:
Код

obj.buffers.onload[0]();
obj.buffers.onload[1]();
obj.buffers.onload[2]();
obj.buffers.onload[3]();
obj.buffers.onload[4]();


Алерт выдаёт: 5,5,5,5,5. И понятно почему: после первого цикла переменная "l" имеет значение 5 и функции её используют.
--------------------
Ненавижу убогую Оперу.
PM MAIL ICQ   Вверх
butionok
Дата 7.3.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 19.1.2005

Репутация: 1
Всего: 3



Zeroglif,  Огромное спасибо!!! Работает!! Жаль я не могу поднять тебе репутацию.
--------------------
Ненавижу убогую Оперу.
PM MAIL ICQ   Вверх
AKS
Дата 7.3.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, интересно, интересно! С arguments.callee.v понравилось больше всего - довольно просто (в смысле рационально)...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1248 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.