Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Action script 2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=49)
-   -   eval для функции (http://www.flasher.ru/forum/showthread.php?t=61590)

Дед Анвирыч 07.08.2004 02:16

eval для функции
 
В переменной obj путь и имя мувика
В переменной method имя функции внутри мувика

Как вызвать obj.method() ?

начинающий 07.08.2004 15:31

При помощи квадратных скобок НЕЛЬЗЯ обратится к мувикам «через один», например:
Код:

var path2MC = 'element.mc'
trace(this[path2MC])  // undefined

Следовательно, придётся реализовать свою функцию, которая возвратит Вам ссылку на мувик, путь к которому задан строчкой:
Код:

function Movie(path)
{
  var pathArray = path.split('.');
  var mc=this;
  for(var i=0; i<pathArray.length; i++)
    mc = mc[pathArray[i]]
  return mc
}

А как теперь пользоваться этой функцией? Тут есть два нюанса:
1) Если функция назначена самому клипу, то просто сделайте так:
Код:

Movie(path2MC).Yo = function(){        trace('Yo') }
...
Movie(path2MC).Yo();

2) Если функция определена в timeline глубоко вложенного клипа, то, конечно, же когда исполняется скрипт данного кадра, эта функция еще не доступна. Следует дождаться не просто загрузки вложенного клипа, а момента, когда выполнение дойдёт до создания данной функции. В этом случае Вам следует поступить так:
Код:

Movie(path2MC).onEnterFrame = function()
{
        this.Test()
        delete this.onEnterFrame
}

Для чистоты эксперимента следует отметить, что ежели у Вас timeline, в которой Вы ожидаете создания функции во вложенном клипе содержит несколько кадров, то в следующий раз не нужно дожидаться создания функции Test(). Можете внедрить в скрипт некоторые флажки, которые будут показывать Вам, что однажды уже Вы переждали и больше не надо(или просто проверить, определена ли функция Movie(path2MC).Test), ну а с другой стороны, можно и обойтись без ожидания вовсе, но только следует понимать и помнить, что метод Test() будет вызван лишь во время второго(и следующих) проходов по timeline. Ну а если же у Вас лишь один кадр, то ждать необходимо обязательно, иначе Test()не будет вызван даже единожды.

artfla$her 08.08.2004 01:28

Если я правильно понял:

a.b.x = function(){
trace("!");
}

path1 = "a.b";
func = "x";

path01 = path1.split(".")[0];
path02 = path1.split(".")[1];

_root[path01][path02][func]();

В примере path1 = obj, func = method. Дед Анвирыч это имел ввиду?

Дед Анвирыч 09.08.2004 01:52

Цитата:

Оригинал написал(а) artfla$her
Если я правильно понял:

_root[path01][path02][func]();

В примере path1 = obj, func = method. Дед Анвирыч это имел ввиду?

Да, именно. Большое всем спасибо

Nirth 09.08.2004 19:56

имеем переменные типа -
statSTR,statDEX,statCON,statWIS,statINT,statCHA
имеем массив stats (таполнение- STR,DEX,CON и тд) .
есть функция.
Код:

function getStat(stat) {
  for (i=0; i<stats.length; i++) {
  if (stat == stats[i]) {
    stat2return = eval("stat"+stats[i]);
    //trace(eval("stat"+stats[i]));
  }
  var path = eval("stat"+stats[i]);
  trace(typeof (path));
 }
}

собственно как я понял eval тут не работает. но и пример с массивом тоже на прокатит.

silin 10.08.2004 12:25

2 Nirth : а чего не работает ?
Код:

function getStat(stat) {
  for (i=0; i<stats.length; i++) {
  if (stat == stats[i]) {
    return  eval("stat"+stats[i]);
        //return this["stat"+stats[i]]//тож работает
        break;
  }
  //var path = eval("stat"+stats[i]);
  var path = this["stat"+stats[i]];
  trace(typeof (path));
 }
}

statSTR=0;statDEX=1;statCON=2;
stats = ["STR","DEX","CON"]
trace(getStat("DEX"));


Nirth 10.08.2004 17:10

возвращает андефайнд.

Nirth 10.08.2004 17:22

возвращает андефайнд.

silin 10.08.2004 17:32

странно
зы: если ты про свою функцию, то она вообще ничего не возвращает (т.е. undefined), а trace определяет тип несуществующего объекта (посмотри чему равна i) - опять undefined: все как написал

Nirth 12.08.2004 23:35

Код:

private var stat:String;
private var stat2return:Number;
private var modifier:String;
public var mod:Number;
private var stats:Array =["STR", "DEX", "CON", "WIS", "INT", "CHA"];
private var i:Number;
//getStat function
 function getStat(stat) {
  for (i=0; i<stats.length; i++) {
  if (stat == stats[i]) {
    trace(this["stat"+stats[i]]);
    var path = eval("stat"+stats[i]);
    trace(typeof (path));
 }
}
}

да нет переменные все есть.

silin 13.08.2004 00:06

я удаляюсь (не врубаюсь о чем речь)

artfla$her 13.08.2004 02:03

Я тоже ничего не понял. Функция silin-а работает правильно. Она может вернуть андефайнд, токлько если не задать значения переменным - statSTR=0;statDEX=1;statCON=2; Что еще там за траблы возникли, не понимаю, хоть убей.


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

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