функции

 

С этим зверем обязательно нужно разобраться. И чем детальней, тем лучше. Хотя для понятности придется упрощать. И вот, если упростить объяснение, то функция, это то же самое что переменная, но переменная хранит в себе данные, а функция хранит в себе команды.

speed = 10; - в контейнере с названием speed хранится цифра 10

function fncMotion (speed){this._x + = speed };- в контейнере с названием fncMotion хранится команда на перемещение мувика.

Так и следует относиться к функции, как к контейнеру для других команд, вычислений и функций и в этот контейнер можно напихать чего угодно :)).

Почему их используют? - это значительно упрошает программирование, конечно если грамотно пользоваться этим инструментом. Функция должна объединять логически связанные команды направленные на достижение некого локального результата. Не стоит валить в одну функцию несколько задач. Это усложнит понимание и управляемость скрипта.

Есть смысл планировать проект на уровне функций, это упростит разработку. Например: задача: рассчитать траекторию движения объекта потребуются функции:

 

Хотя рассчет траектории движения объекта не обойдется без факторов влияния, однако не стоит объединять их в одну функцию, а тем более свалить в кучу и с функцией рассчета основной траектории. Ведь если понадобится рассчитывать факторы влияния для другого объекта, имеющего другие свойства, нам придется писать всё заново. А если описать отдельно каждый фактор, то таких проблем не возникнет.

Функции иногда называют процедурами. Их вид от этого особо не меняется, но процедурами называют такие функции, которые совершают действия над объектами, как во втором примере ниже. В то время, как функции вычисляют и возвращают значение: пример 1 функция:

function fncArea (width, height){ return width*height }

а используем так:

area = fncArea(10, 20)

пример 2 процедура:

function fncMotion (speed){ this._x + = speed };

а используем так:

any_movieclip.fncMotion (10)

И тут же чуствуем разницу, прежде всего в синтаксисе использования.

На примерах мы рассмотрим какие у функций есть явные и скрытые составляющие. Попробуем обползать их вдоль и поперек.

 

Аргументы - это данные, которые мы хотим передать функции для использования. Как правило аргументы именуют, в нашем последнем примере мы поименовали два аргумента - width и height и теперь мы можем обращаться к ним по имени, что с успехом и делаем. Но не всегда возможно задать имена аргументам, например не зная заранее их количество. В этом случае нам поможет arguments.

 

arguments - это массив всех аргументов, которые мы передаем функции, т.е. всё что мы пишем внутри скобок при вызове функции. Но не только. Пришла пора разобраться по-взрослому :). В новом файле в первом кадре пишем:

 

function fncSumm () { // задаем функцию

var num; // декларируем локальную переменную, она умрет вместе с завершением функции

for (i in arguments) { // перебираем все объекты в arguments

trace (i+" - "+arguments[i]+" typeof == "+typeof arguments[i]); // выводим имЯ объекта, значение и его тип в окно Output

}

for (i=arguments.length; i+1; i--) { // перебираем все аргументы в массиве

num += arguments[i]; // суммируем аргументы

}

return num; // возвращаем результат

}

result = fncSumm(2, 30, 50, 33); // с помощью функции суммируем 2, 30, 50, 33 и присваиваем значение переменной result

trace ("result = "+result); // выводим значение переменной в окно Output

 

И что же мы видим?

3 - 33 typeof == number - объект в массиве номер 3 со значением 33 и типом number

2 - 50 typeof == number - объект в массиве номер 2 со значением 50 и типом number

1 - 30 typeof == number - объект в массиве номер 1 со значением 30 и типом number

0 - 2 typeof == number - объект в массиве номер 0 со значением 2 и типом number

callee - typeof == function - а вот этого мы не писали!!! объект с именем callee и типом function - поговорим о нем отдельно.

result = 115 - странно... правильный результат.

 

Итак, помимо ожидаемых нами появился интересный объект: callee - typeof == function

 

callee - свойство, возвращает ссылку на функцию, если написать где-нибудь внутри функции строку

arguments.callee(),

то получим бесконечную рекурсию. Рекурсия, это когда функция сама себя вызывает. Функция будет сама себя вызывать постоянно и не даст больше ничему сдвинуться с места, если ее вызывать без каких либо условий. Но если написать например:

 

function fncRecursion (i) {
trace (i + "\tне бесконечно ");

if (i>0) {arguments.callee(i-1);}

}

fncRecursion(10);

 

Итак, arguments - это массив, который содержит в себе все параметры вписанные в скобках функции. В конце этого урока есть домашнее задание, попробуйте внимательно с ним разобраться :). return - ключевое слово которое дает команду возвратить некое значение. Если нет этого слова, то функция ничего не возвращает. как только исполняется команда return, то выполнение функции прерывается.

Домашнее задание: попробуйте разобраться почему выводятся такие строки, поэкспериментируйте с аргументами на входе функции, посмотрите на результаты.

 

function fncAnyFunction () {

return 10

}

function fncArgs (var1, var2) {

arguments.fncAnyFunction = fncAnyFunction

for (i in arguments) {

trace ("аргумент: "+i+"\tзначение: "+arguments[i]+"\tтип: "+typeof arguments[i]);

}

for (i in arguments.callee) {

trace ("странный объект: "+i+"\tзначение: "+arguments.callee[i]+"\tтип: "+typeof arguments.callee[i]);

}

}

fncArgs.fncAnyFunction = fncAnyFunction

fncArgs.any_var = 100;

fncArgs(22, fncAnyFunction, "fncAnyFunction", fncAnyFunction(), true, new Array(1,2,3), new Sound());

Все кто испугались - не бойтесь! В реальной жизни, как правило, нет необходимости пользоваться многими из использованных в домашнем задании извращений. Это нужно только в программировании :)). Для начала достаточно вынести из этого урока только одно: функция - это контейнер, содержащий команды. И в дальнейшем не используйте этот контейнер как дырявый мусорник. И всё будет ОК.

 

Hosted by uCoz