Загадка про addProperty()
Загадка від Олександра Мостового (він же Ushan).
// ActionScript 1.0
flea = {};
flea.setter = function():Void{};
flea.getter = function() {
this.i = isNaN(this.i) ? 0 : this.i+1;
return this.property;
};
flea.addProperty("property", flea.getter, flea.setter);
flea.property;
trace("i: "+flea.i);
Яке значення flea.i буде в output?
Далі відповідь
i: 64
Чому не 255? Чому не відбувається зациклювання? Чим це не рекурсія?
На цей час можу сказати тільки одне, при подібному використанні геттерів-сеттерів в AS2 та AS3 відвувається зациклювання (256 levels of recursion were exceeded in one action list.).
Відповіді:
гарна хлопиц знайшов відповідь на запитання “Чому не 255?”:
var i=0;
function a() { test(); }
function b() { a(); }
function c() { b(); }
function test(){
i++;
trace(i);
c();
}
test();
Тобто в AS1.0 addProperty створює обгортку з 3-х функцій, і при рекурсії, інкрементація i виповлюється в 4 рази (3+функція в якій виповнюється інкрементування) меньше разів ніж 256, тобто 64.
Таґи: addProperty
Листопад 28, 2007 в 10:36
проперти ставяса тока на класс то бишь у тя прототипу в AS2.
а тыж ставя непомерну в объектовину flea.
Листопад 28, 2007 в 10:41
flea = { s:”" };
flea.setter = function():Void{};
flea.getter = function() {
this.i = isNaN(this.i) ? 0 : this.i+1;
flea.s += ‘1′;
return this.property;
};
flea.addProperty(”property”, flea.getter, flea.setter);
flea.property;
trace(”i: “+flea.i);
trace(”s: “+flea.s);
видна чта рекрсия образуяся и на 64 итерациях ее убивит
по што ставя return this.property ? може return this.i хоцел?
Листопад 28, 2007 в 11:29
Пробачте, але ж у цьому й була загадка, чому рекурсія не зациклюється (видаючи помилку), а припиняється на 65-й ітерації (навіть не на 256-й)?
Листопад 28, 2007 в 11:44
AVM1: RECURSION_LEVEL_LIMIT = 64;
AVM2: RECURSION_LEVEL_LIMIT = 255;
це индусские девелопери побачили шо 64 мало =)
Листопад 28, 2007 в 15:07
Воно було б так, якби такий код:
function test(){
test();
}
test();
не видавав помилку “256 levels of recursion were exceeded in one action list.”
Тобто все ж таки

AVM1: RECURSION_LEVEL_LIMIT = 255;
Листопад 28, 2007 в 15:34
…дык видно ж для AVM1 не такая конструкция виходит, а такая:
var i=0;
function a() { test(); }
function b() { a(); }
function c() { b(); }
function test(){
i++;
trace(i);
c();
}
test();
Листопад 28, 2007 в 16:50
Добре! Дякую
Це пояснює чому 64, але чому немає “256 levels of recursion were exceeded in one action list.” ?