Actionscript 2 функции - PullRequest
       20

Actionscript 2 функции

1 голос
/ 27 сентября 2008

Я опытный программист, но только начинаю с Flash / Actionscript. Я работаю над проектом, который по определенным причинам требует от меня использования Actionscript 2, а не 3.

Когда я запускаю следующее (я просто помещаю его в первый кадр нового флеш-проекта), вывод будет 3, а не 1? Мне нужно, чтобы это было 1.

Почему область действия переменной 'ii' продолжается между циклами?

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1; 
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();

Ответы [ 3 ]

2 голосов
/ 27 сентября 2008

К сожалению, AS2 не такой язык; у него нет такого закрытия. Функции не являются первоклассными гражданами в AS2, и одним из результатов этого является то, что функция не сохраняет свою собственную область, она должна быть связана с некоторой областью, когда она вызывается (обычно это та же область, где функция само по себе определено, если только вы не используете методы call или apply).

Затем, когда функция выполняется, область видимости переменных внутри нее - это просто область, где бы она ни вызывалась, - в вашем случае, область за пределами вашего цикла. Вот почему вы можете делать такие вещи:

function foo() {
    trace( this.value );
}

objA = { value:"A" };
objB = { value:"B" };

foo.apply( objA ); // A
foo.apply( objB ); // B

objA.foo = foo;
objB.foo = foo;

objA.foo(); // A
objB.foo(); // B

Если вы привыкли к настоящим ОО-языкам, это выглядит очень странно, и причина в том, что AS2 в конечном итоге является прототипированным языком . Все, что выглядит объектно-ориентированным, просто совпадение. ; D

0 голосов
/ 29 сентября 2008

Я придумал какое-то странное решение своей проблемы:

var fs:Array = new Array();

for (var i = 0; i < 3; i++){    
    var ii = i + 1;   

    f = function(j){
        return function(){
            trace(j);
        };
    };
    fs[i] = f(ii);
}

fs[0](); //1
fs[1](); //2
fs[2](); //3
0 голосов
/ 27 сентября 2008

К сожалению, Actionscript 2.0 не имеет сильной области видимости ... особенно на временной шкале.

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1;     
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();
trace("out of scope: " + ii + "... but still works");
...