Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   насчёт запоминания this (http://www.flasher.ru/forum/showthread.php?t=106548)

aQuestion 14.01.2008 11:40

насчёт запоминания this
 
Код:

var F:Function = function () {
        this.f = function () {
                trace (this);
        };
        this.toString = function () {
                return "hello";
        };
};
var o:Object = new F (); o.f ();

пишет hello
Код:

function G ():Function {
        var F:Function = function () {
                this.f = function () {
                        trace (this);
                };
                this.toString = function () {
                        return "hello";
                };
        };
        var o:Object = new F ();
        return o.f;
}; G () ();

пишет [object global]

Код:

function G ():Function {
        var F:Function = function () {
                this.f = function () {
                        trace (this);
                };
                this.toString = function () {
                        return "hello";
                };
        };
        var o:Object = new F ();
        return o.f;
}; var z:Function = G (); z ();

пишет [object MainTimeline]

Почему?

2morrowMan 14.01.2008 11:47

Код:

return o.f();

aQuestion 14.01.2008 11:50

так как o.f () ничего не возвращает, то в твоей редакции будет андефайнед. вопрос, собственно, не в том. я так понял, this с функцией в AS3 никогда не расстаётся, в свете чего вышеприведенный аутпут непонятен :(

2morrowMan 14.01.2008 11:55

Возвращает или нет, но функцию вызывают со скобками в конце!!!

aQuestion 14.01.2008 12:37

я чет не понял, что ты хочешь этим сказать. а я вот хочу написать БЕЗ скобок. компилер не против, рантайм не против, а вот человек завтрашнего дня почему-то против.

2morrowMan 14.01.2008 13:03

Цитата:

Сообщение от aQuestion
я чет не понял, что ты хочешь этим сказать. а я вот хочу написать БЕЗ скобок. компилер не против, рантайм не против, а вот человек завтрашнего дня почему-то против.

:)

Код:

function G ():Function {
        var F:Function = function () {
                this.f = function () {
                        trace (this);
                };
                this.toString = function () {
                        return "hello";
                };
        };
        var o:Object = new F ();
        return o.f;
}; var z:Function = G (); z ();

грубо говоря z = o.f, т.е.:
Код:

z = function()
{
        trace (this);
}

Типа так... :)

etc 14.01.2008 13:05

2morrowMan, вы снова не в теме со своими скобками.

aQuestion, в первом случае все понятно? Создали объект типа Function, у него есть функция f, область видимости ссылается на этот объект.

Во втором случае возвращается ссылка на функцию, которая по факту становится анонимной, т.к. объект, к которому она была привязана, был удален (он же локальный внутри функции). Функция существует, объект — нет.

В третьем случае это особенности работы Flash CS3, z — поле класса MainTimeline, z ссылается на функцию, которая сама по себе анонимная, но т.к. z принадлежит классу, то область видимости внутри функции будет ссылаться на класс.

wvxvw 14.01.2008 13:16

Код:

function G():Function {
        var F:Function = function() {
                this.f = function() {
                trace(this);
                };
                this.toString = function() {
                return "hello";
                };
        };
        var o:Object = new F();
        return o.f;
}
var obj:Object = {toString:function(){return 'hello again!'}};
G().apply(obj);

Очевидно по той же причине, по которой у arguments нету больше свойства caller - this в функции находится динамически, а не является каким-то ее параметром.

etc 14.01.2008 13:22

Причем тут caller?

aQuestion 14.01.2008 13:24

Цитата:

Сообщение от __etc
функцию, которая по факту становится анонимной, т.к. объект, к которому она была привязана, был удален (он же локальный внутри функции). Функция существует, объект — нет.

Код:

var F:Function = function () {
        this.f = function () {
                trace (this);
        };
        this.toString = function () {
                return "hello";
        };
};
var o:Object = new F ();
var z:Function = o.f; z ();

по прежнему пишет [object MainTimeline], хотя объект о никуда не девается. внутри функции это безобразие выдаёт [object global], т.е. функция тупо отваливается от объекта на этапе взятия o.f.


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

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