Ключевое слово this в ActionScript используется для
доступа к текущей области кода, или объекта, в текущем блоке, который
запущен в данном контексте. Использование this на временной шкале будет
ссылаться на экземпляр MovieClip, которому принадлежит эта временная
шкала. // Main timeline trace(this); // [object MainTimeline]
В функциях обращение this ссылается на объект, в котором определена
текущая функция. Так как одна и та же функция может быть с легкостью
определена во множестве объектов, одиночная функция может использовать
ссылку this и осуществлять действия над различными объектами,
основываясь на объекте, из которого она вызывается. // The this reference depends on // the object "owning" the function call var joe:Object = new Object(); joe.name = "Joe"; joe.showName = function():void { trace(this.name); } var jane:Object = new Object(); jane.name = "Jane"; jane.showName = joe.showName; joe.showName(); // traces "Joe" jane.showName(); // traces "Jane" Здесь
было только одно определение функции для переменной showName
(безымянная), изначально определенной в объекте joe. Эта функция была
потом привязана к объекту jane, снова с использованием имени переменной
showName – одна функция, две ссылки на нее в двух разных объектах.
Объект, из которого вызывается функция, определяет, на какой объект
ссылается ключевое слово this. Такое поведение
было совместимо со всеми функциями в ActionScript 2. Теперь, в
ActionScript 3, это происходит только в случае безымянных функций.
Именованные функции в ActionScript 3 теперь поддерживают закрытия
метода, или граничат с объектом, для которого они изначально
определены. Если бы приведенный выше пример был переписан заново с
использованием именованной функции…Смотрите, что получается, когда
функции вызываются из соответствующих им объектов. // In ActionScript 3, this in named functions always reference // the object of the scope in which they were defined function showName():void { trace(this.name); } var joe:Object = new Object(); joe.name = "Joe"; joe.showName = showName var jane:Object = new Object(); jane.name = "Jane"; jane.showName = showName; joe.showName(); // traces "root1" jane.showName(); // traces "root1"
Не важно, для какого объекта определена функция showName, ее ссылкой на
него всегда будет главная временная шкала (root1). Это происходит
потому, что в ActionScript 3 в качестве именованной функции с закрытием
метода, она всегда будет ссылаться на экземпляр объекта оригинального
контекста определения функции. Это особенно полезно при обработке
событий, где раньше необходимо было использовать искусственные приемы
для поддержания валидной ссылки на экземпляр, для которого определен
обработчик (то есть используя Delegate (mx.utils.Delegate) в
ActionScript 2).
|