Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2766 / 183 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 5:

Функции

Перегенерация функций для установки параметров

В языке 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. Казалось бы, до тех пор, пока оно не заключено в функцию, смысла это слово не имеет. Но в том-то и дело, что любой код рано или поздно мы можем захотеть вынести в отдельную функцию и вызывать его потом из разных мест. Потому и писать мы стараемся так, чтобы перенос написанного в функцию впоследствии не вызвал затруднений.