Просмотр полной версии : насчёт запоминания 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);
}
Типа так... :)
2morrowMan, вы снова не в теме со своими скобками.
aQuestion, в первом случае все понятно? Создали объект типа Function, у него есть функция f, область видимости ссылается на этот объект.
Во втором случае возвращается ссылка на функцию, которая по факту становится анонимной, т.к. объект, к которому она была привязана, был удален (он же локальный внутри функции). Функция существует, объект — нет.
В третьем случае это особенности работы Flash CS3, z — поле класса MainTimeline, z ссылается на функцию, которая сама по себе анонимная, но т.к. z принадлежит классу, то область видимости внутри функции будет ссылаться на класс.
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 в функции находится динамически, а не является каким-то ее параметром.
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.
Я ж и говорю, что нет... =/
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.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.