Беларусь, рогачёв |
Функции
Перегенерация функций для установки параметров
В языке AсtionScript есть всего четыре способа создавать новые объекты (не считая примитивные). Это оператор new, с которым мы будем иметь дело далее при создании объектов классов. Это команды краткого создания объектов и массивов с помощью фигурных и квадратных скобок соответственно. И, наконец, это оператор function, создающий новую функцию. Хотя компилятор, создающий *.swf-файл, проверяет синтаксис и, видимо, определяет, что в данном месте создается функция (а также переводит код этой функции в применяемую в *.swf-файлах форму), сам объект функции создается каждый раз заново, когда интерпретатор *.swf-кода встречает ключевое слово function, используемое как оператор. То есть определение функции "на лету" создает новый объект каждый раз, когда этот код встречается инт ерпретатору. А это как раз то, что нужно для наших целей. Перенесем код создания функции реакции на сообщение в цикл. Тогда "клиентская" часть нашего примера будет выглядеть так:
for(var i = 1; i<=controlsNumber; i++){ var curControl = eval("control" + i); var reactionFunction = function(curValue){ var control = arguments.callee.control; var result = curValue - control.oldValue; trace("reaction: difference = " + result); } reactionFunction.control = curControl; curControl.subscribe(reactionFunction); // Тестируем: curControl.setValue(4*i+1); } trace("------------------"); for(var i = 1; i<=controlsNumber; i++){ eval("control" + i).setValue(4*i + 1); }
На выходе мы на сей раз получим:
control1.subscribe() called control1.setValue(5) called control1.raiseEvent() called reaction: difference = 2 control2.subscribe() called control2.setValue(9) called control2.raiseEvent() called reaction: difference = 4 control3.subscribe() called control3.setValue(13) called control3.raiseEvent() called reaction: difference = 6 control4.subscribe() called control4.setValue(17) called control4.raiseEvent() called reaction: difference = 8 control5.subscribe() called control5.setValue(21) called control5.raiseEvent() called reaction: difference = 10 ------------------ control1.setValue(5) called control1.raiseEvent() called reaction: difference = 0 control2.setValue(9) called control2.raiseEvent() called reaction: difference = 0 control3.setValue(13) called control3.raiseEvent() called reaction: difference = 0 control4.setValue(17) called control4.raiseEvent() called reaction: difference = 0 control5.setValue(21) called control5.raiseEvent() called reaction: difference = 0
Теперь все в порядке: мы устанавливаем в каждый контрол то значение, которое там и было, и в качестве разницы между старым и новым числами действительно получаем ноль.
Обратите еще раз внимание на то, что внутри цикла мы везде, где можно, поставили ключевое слово var. Казалось бы, до тех пор, пока оно не заключено в функцию, смысла это слово не имеет. Но в том-то и дело, что любой код рано или поздно мы можем захотеть вынести в отдельную функцию и вызывать его потом из разных мест. Потому и писать мы стараемся так, чтобы перенос написанного в функцию впоследствии не вызвал затруднений.