Загадка про 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.

Таґи:

Коментарів: 13 to “Загадка про addProperty()”

  1. гарна хлопиц:

    проперти ставяса тока на класс то бишь у тя прототипу в AS2.
    а тыж ставя непомерну в объектовину flea.

  2. гарна хлопиц:

    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 хоцел?

  3. pirrest:

    Пробачте, але ж у цьому й була загадка, чому рекурсія не зациклюється (видаючи помилку), а припиняється на 65-й ітерації (навіть не на 256-й)?

  4. гарна хлопиц:

    AVM1: RECURSION_LEVEL_LIMIT = 64;
    AVM2: RECURSION_LEVEL_LIMIT = 255;

    це индусские девелопери побачили шо 64 мало =)

  5. pirrest:

    Воно було б так, якби такий код:

    function test(){
    test();
    }
    test();

    не видавав помилку “256 levels of recursion were exceeded in one action list.”

    Тобто все ж таки
    AVM1: RECURSION_LEVEL_LIMIT = 255;
    :)

  6. гарна хлопиц:

    …дык видно ж для AVM1 не такая конструкция виходит, а такая:

    var i=0;
    function a() { test(); }
    function b() { a(); }
    function c() { b(); }
    function test(){
    i++;
    trace(i);
    c();
    }
    test();

  7. pirrest:

    Добре! Дякую
    Це пояснює чому 64, але чому немає “256 levels of recursion were exceeded in one action list.” ?

  8. ExchangeMAn:

    Link exchange?

  9. ExchangeMAn:

    5ka!

  10. Виктор:

    Можно ли взять одну картинку с Вашего блога? Очень понравилась. Линк на Вас есстественно поставлю.

  11. Виталий:

    А Вы на заказ не пишите?

  12. Шурик:

    Подскажите, а как пройти в библиотеку?

  13. Васин:

    По моему Вам нужно чаще отдыхать, очень уж Вы заработались.

Залиште свій коментар