Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Динамическое построение функции (вопрос к реал.знающим AS1 - 2) (http://www.flasher.ru/forum/showthread.php?t=82945)

~~~ 24.07.2006 17:45

Динамическое построение функции (вопрос к реал.знающим AS1 - 2)
 
Динамическое построение функции (вопрос к реал.знающим AS1 - 2)

Код:

for (var i = 0; i<libsreg.firstChild.childNodes.length; i++) {
        libName[i] = libsreg.firstChild.childNodes[i].attributes.name;
        libLink[i] = libsreg.firstChild.childNodes[i].attributes.link;
        libExt[i] = libsreg.firstChild.childNodes[i].attributes.ext;
        //trace(libName[i]+":"+libLink[i]+":"+libExt[i]);
        /////////////////////////////////////
        set("onMenuClick_"+libName[i], function () {
                stat_txt.textColor = 0;
                det = libLink[i];
                ext = libExt[i];
                mdm.prompt(libName[i]+" Library loaded");
                // значения 'libName[i]' в сгенерённой функции остаются именно 'libName[i]', а не присвоенное libName[i] значение во время создания функции.
        });
}

Что делаем:
В цикле генерим кучу callback-функций взависимости от содержания XML.
Каждая нода = навая функция.

На выходе реально получаем правильно названные функции, типа:
onMenuClick_BLABLA() , при соответствующем атрибуте ноды XML:
<k name="BLABLA" link="libs/BLABLA.dll" ext=".bla"></k>...
ОДНАКО:
Внутри функции значения, типа 'libName[i]' в сгенерённой функции остаются именно 'libName[i]', а не присвоенное libName[i] значение во время создания функции. Т.к. когда далее она вызывается зачения libName[i] равны undefined или последнему созданному в цыкле, это естественно "не катит"!

Суть вопроса:
Как это обойти?
Как добиться того чтоб внутри уже скенерённой функции сохранялась строка вида не ' ext = libExt[i]; ' , a ' ext = "статическое значение"; ' , где "статическое значение" = статическое значение, полученное, при создании функции, из соответствующей ноды>атрибута> xml.

Заранее благодарю.
С уважением Александр Козловский.

~~~ 24.07.2006 18:48

Прошу прощения за замороченность вопроса, просто я последнее время очень много проф.тех.документации написал...

silin 24.07.2006 19:45

как пишешь libName[i], так и получаешь (прикинь чему равна i на момент вызова твоих функций..)
можно сохранять идентификатор в самой функции и использовать его для доступа к данным при вызове:
Код:

var libsreg=new XML('<list><k name="BLA" /><k name="BLABLA" /></list>');
var libName=[];
for (var i = 0; i<libsreg.firstChild.childNodes.length; i++) {
        libName[i] = libsreg.firstChild.childNodes[i].attributes.name;
        /////////////////////////////////////
        var f=this["onMenuClick_"+libName[i]]=function (){
                trace(libName[arguments.callee.id]);
        };
        f.id=i;
       
}
onMenuClick_BLABLA();//BLABLA
onMenuClick_BLA();//BLA


iNils 24.07.2006 20:07

~~~, прочтите пункт 3 http://www.flasher.ru/forum/showthread.php?t=79864 и больше так не делайте.

~~~ 25.07.2006 10:30

OK
 
Цитата:

Сообщение от iNils
~~~, прочтите пункт 3 http://www.flasher.ru/forum/showthread.php?t=79864 и больше так не делайте.

Прошу прощения, Больше не повторится. :)

To silin: Спасибо. Мысль хорошая. Как это я после трёх суток работы не додумался :). Реально Большое Спасибо!

werdn 25.07.2006 15:09

По пути вопрос: тело функции - заранее определенный код или там может быть в виде текста ActionScript ? Извините, если вопрос показался глупым.

silin 25.07.2006 16:12

там может быть что угодно, в том числе и кусок "текста ActionScript", но и воспринят он будет как строка..
дальше можно попробовать извратится пропарсить ее и с помощью eval, call, this[] или еще чего заставить плеер выполнить ..
только оно тебе надо?..

werdn 25.07.2006 16:15

Число для интереса. Правильно я понял, что вся та котовасия, ранее расписанная была для обеспечения большей скорости работы?

silin 25.07.2006 16:26

это вопрос к автору: какие резоны городить этот огород
я, если честно, их не вижу..

~~~ 25.07.2006 20:49

Цитата:

Сообщение от silin
это вопрос к автору: какие резоны городить этот огород
я, если честно, их не вижу..

Всё ЭТО пишется воимя Великой Модульности програмного продукта.
А этот конкретный код =
Цикл объявления callback-функций для пунктов меню, таким же макаром генерируемых из полученой xml.
Далее строки этого xml будут получаться с сервака.


Часовой пояс GMT +4, время: 03:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.