Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3401 / 339 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 7:

Интерфейсы AсtionScript

Мы создали функцию в памяти. Переменная hello содержит ссылку на эту функцию. Любая переменная, содержащая ссылку на функцию, может использоваться для выполнения этой функции посредством добавления пары скобок.

hello ();

Теперь мы можем передать эту ссылку другой переменной.

greeting = hello;

Здесь приветствие в переменной дает ссылку на функцию. Обе переменные теперь содержат ссылку на одну и ту же функцию. Теперь вы можете выполнить функцию следующим образом.

greeting();

Это действует даже для встроенных функций и специальных объектов во Flash. Например, у нас есть объект Math, содержащий метод random(). Это просто функция в памяти. Переменная random в объекте Math содержит ссылку на эту функцию. Мы можем взять эту ссылку и сохранить ее в любом нужном месте.

myRand = Math.random;

Теперь myRand содержит ссылку на функцию, которая будет возвращать случайное число. Вы можете вызвать ее так.

myRand();

Заметьте, что это выражение отличается от следующего.

myRand = Math.random();

В данном случае после имени функции поставлены скобки, поэтому функция и выполняется. Затем она будет возвращать случайное число и передавать его myRand. Это не совсем то, что нужно, но вы будете часто допускать эту ошибку. Даже я до сих пор это делаю!

Итак, возвращаемся к нашему коду. Теперь у вас должно быть более ясное представление о том, что здесь происходит.

function move() {
    this._x++;
}
mc1_mc.onEnterFrame = move;

Мы создаем функцию в памяти, move представляет ссылку на данную функцию и передает эту ссылку в mc1_mc.onEnterFrame. Внимание! Многие допускают ошибку, набирая следующий код.

mc1_mc.onEnterFrame = move();

Теперь вы должны понимать, почему эта структура не будет работать, и что на самом деле происходит.

Вы также можете прибегнуть к сокращенному методу определения управляющих элементов событий.

mc1_mc.onEnterFrame = function() {
    this._x++;
};

Это можно интерпретировать как создание функции без имени.

function______________ () {
    this._x++;
}

Ссылка на функцию не передается переменной, а выражение выше само по себе при запуске дает в результате ссылку на функцию. Поэтому мы можем взять результат определения функции и присвоить его прямо управляющему элементу события.

mc1_mc.onEnterFrame=function______________________ () {
    this._x++;
};

Безусловно, мы привели длинный пробел в строке для полноты представления. На самом деле нужно писать так, как показано в первом примере выше. Этот метод полезен, когда вы знаете, что вы будете присваивать функцию только один раз и только одному управляющему элементу.

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

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip?