PDA

Просмотр полной версии : насчёт запоминания this


aQuestion
14.01.2008, 11:40
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
я чет не понял, что ты хочешь этим сказать. а я вот хочу написать БЕЗ скобок. компилер не против, рантайм не против, а вот человек завтрашнего дня почему-то против.
:)

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
функцию, которая по факту становится анонимной, т.к. объект, к которому она была привязана, был удален (он же локальный внутри функции). Функция существует, объект — нет.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.

wvxvw
14.01.2008, 13:25
Я ж и говорю, что нет... =/

etc
14.01.2008, 13:35
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.
Не отваливается:
var o:Object = new Object();
o.f = function():void {
trace(this);
}
o.toString = function():String {
return "o";
}
var a:Object = new Object();
a.toString = function():String {
return "a";
}
a.f = o.f;
o.f();
a.f();


Для таких объектов области видимости меняются, как в AS2.