все тесты проводились во Flash CS4
2. имеют кривую типизацию.
Код AS3:
import flash.events.EventDispatcher;
function test():Function {
return function() {
return 0;
}
}
var dispatcher = new EventDispatcher();
dispatcher.addEventListener( 'test', test() ); // всё окей
dispatcher.addEventListener( 'test', test ); // ArgumentError: Error #1063
dispatcher.dispatchEvent( new Event( 'test' ) );
это значит, что анонимные функции не имеют сигнатуры.
3. жрут больше памяти.
Код AS3:
import flash.sampler.getSize;
function test():Function {
return function() {
return 0;
}
}
trace( getSize( test ) ); // 32
trace( getSize( test() ); // 666
разница в 20 раз
4. у них плавающий объект активации.
Код AS3:
function test():Function {
trace( '1', this );
return function() {
trace( '2', this );
}
}
test()();
// 1 [object MainTimeline]
// 2 [object global]
var f:Function = test();
f();
// 1 [object MainTimeline]
// 2 [object MainTimeline]
var o = {};
test.call( o );
f.call( o );
//1 [object MainTimeline]
//2 [object Object]
афигенные результаты!
5. от них проблемно отписываться.
Код AS3:
import flash.events.EventDispatcher;
function test():Function {
return function() {
return 0;
}
}
var dispatcher = new EventDispatcher();
dispatcher.addEventListener( 'test', test() );
как отписаться от такого метода снаружи?
6. их нельзя сравнивать друг с другом.
Код AS3:
function test():Function {
return function() {
return 0;
}
}
trace( test() === test() ) // false;
trace( test === test ); // true
соответсвенно потеря ссылки на метод приводит нас к пунктам 1 и 5