Показать сообщение отдельно
Старый 30.06.2009, 12:45
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 19  
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
все тесты проводились во 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


Последний раз редактировалось etc; 02.07.2009 в 13:44.