Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Синтаксис неведомый мне (http://www.flasher.ru/forum/showthread.php?t=131385)

nikewist 19.10.2009 15:31

Синтаксис неведомый мне
 
Всем добрый день! Недавно изучал скролл многоуважаемого Walsh и наткнулся на строки, которые привели меня в некоторое замешательство, потому как я такого синтаксиса еще не видел. Объясните кто-нибудь, пожалуйста, что это такое и с чем его едят:)
Код AS1/AS2:

pimp._y = pimp._y < pimp_start ? pimp_start : pimp._y > pimp_stop ? pimp_stop : pimp._y;

И второе, там же есть еще один интересный момент. В хэлпе сказано русским по белому:

Код AS1/AS2:

someListener.onMouseMove = function() { ... };

А у Walsh вот так. Это как? Там же справа должна быть функция!

Код AS1/AS2:

this.onMouseMove = scrolling;


VVall 19.10.2009 15:55

http://ru.wikipedia.org/wiki/Тернарн...овная_операция

alexcon314 19.10.2009 15:58

1.Буквальный "перевод" строки
Цитата:

pimp._y = pimp._y < pimp_start ? pimp_start : pimp._y > pimp_stop ? pimp_stop : pimp._y;
если ничего ненапутал такой:
Код:

if (pimp._y < pimp_start) {
        pimp._y = pimp_start;
} else {
        if (pimp._y > pimp_stop) {
                pimp._y = pimp_stop;
        } else {
                pimp._y = pimp._y;
        }
}

более просто
Код:

a = c < b ? c : b;
//что эквивалентно
if (c < b) {
        a = c;
} else {
        a = b;
}

2. В примере из хэлпа справа стоит анонимная функция.
у Wolsh'a справа стоит ссылка на функцию, которая была объявлена где-то в коде как
Код:

function scrolling(){
...
}

или как
Код:

scrolling = function(){
...
}

Ссылками вцелом удобнее пользоваться.
Вобщем, такой вот стиль.

nikewist 19.10.2009 16:25

Спасибо Вам, добрые люди!

Волгоградец 19.10.2009 16:27

Интересный вопрос. В случае одного использования тернарного оператора все понятно. Но в коде Walsh'а их два. А если их два, то выполнение идет справа налево. Как выглядит аналог if/else в таком случае?

nikewist 19.10.2009 17:47

По первому вопросу более или менее ясно. Немного порылся в инете, но так и не понял:( зачем анонимная функция в данном примере? Почему надо писать scrolling, а не scrolling()? Тем более, что объявлялась она как
Код AS1/AS2:

function scrolling(){
...
}

И что самое ужасное, это то, что даже если прописать scrolling(), то оно так не работает! Вообщем кипят мои мозги...

.true 19.10.2009 17:56

Код AS1/AS2:

this.onMouseMove = scrolling; == this.onMouseMove = function(){scrolling();}

прописать можно или так или так. Но. в первом случае ты подразумеваешь просто название функции, ты и так знаешь, что вызвать так можно только функцию.

А в блоке function(){

}

ты описываешь свои действия, выражения, и необязательно функции. Во втором примере можно написать более 1 выполняемой функции если нужно, в первом - только 1.

TihelpER 19.10.2009 17:58

nikewist

Следующий код даёт ссылку на функцию scrolling()
Код AS1/AS2:

mc.onPress = scrolling

Если мы пишем scrolling(), то есть со скобочками, то мы либо объявляем её:
Код AS1/AS2:

function scrolling() {
...
}

Либо вызываем её:
Код AS1/AS2:

if(какое либо условие) {
scrolling()
}

Когда мы пишем только название функции мы именно даём ссылку на неё.

Если более дотошно, то, грубо говоря, следующий код:
Код AS1/AS2:

mc.onPress = scrolling;

является аналогом вот такого, возможно более привычного Вам:
Код AS1/AS2:

mc.onPress = function() { // Событие - нажали на клип
scrolling() //вызываем функцию
}


nikewist 19.10.2009 23:36

Фуууухххх...В принципе я понял. Понял, что вместо того, чтобы вызвать напрямую функцию, мы вызываем анонимную функцию, которая вызовет ту функцию, которая мне нужна. Действительно, так проще и удобнее:D Вероятно, я отношусь к категории товарищей, которым надо пользоваться только if...:quiet:
Но если серьёзно, если мы вызываем анонимную функцию, которая фактически вызывает довольно определенную функцию, то зачем эти телодвижения, где логика, где рациональное зерно?
В чем отличие в принципе работы. В математическом смысле. Потому что если я прописываю не ссылку на функцию, а напрямую вызываю функцию, то программа не работает...А с ссылкой работает. Работает, не работает, работает, не работает...:)

mooncar 19.10.2009 23:57

Автор, часто бывает удобнее задать для какого-то действия функцию, и ее вызывать из разных мест - например, либо по нажатию кнопки, либо по какому-то другому событию. Например.
Код AS1/AS2:

function doIt() {  //эта функция делает полупрозрачными сто объектов mc1....mc100
        for (i = 1; i <= 100; i++) {
                _root['mc' + i]._alpha = 50;
        }
}
 
btn.onPress = doIt; //функция doIt сработает при нажатии на кнопку btn
btn.onRelease = doIt; //функция doIt сработает также при отпускании кнопки btn
 
text_tf.onChanged = doIt; //функция doIt сработает при вводе нового символа в текстовое поле text_tf
 
//постоянно проверяем изменение триггера val, если = 1, также сработает функция doIt
this.onEnterFrame  = function() {
  if (val == 1) {
    doIt();
  }
}

Другой пример. Назначаем обработчики onRelease для 20-ти кнопок в цикле:
Код AS1/AS2:

function goThere () {
      _root['mc' + this.num].gotoAndPlay(50);
}
 
for (i = 1; i <= 20; i++) {
        this['btn' + i].num = i;
        this['btn' + i].onRelease = goThere;
}
//this внутри функции goThere указывает на соответствующую кнопку, для которой данная функция работает, то есть btn1... btn20
//поэтому this.num  тут будет равно последовательно btn1.num... btn20.num, то есть 1....20

Третий пример. Меняем поведение кнопки:
Код AS1/AS2:

function doOne () {
      trace('Делай раз!')
}
 
function doTwo () {
      trace('Делай два!')
}
 
//В одной части кода:
btn.onRelease = doOne;
....
//Где-то в другом месте, при других обстоятельствах, но для той же кнопки:
btn.onRelease = doTwo;
 
//либо:
if (val == 0) {
      btn.onRelease = doOne;
}
else {
      btn.onRelease = doTwo;
}

При такой записи код становится гибче, удобнее для модернизации, переноса в другие места и т.д.

И еще. Поймите простую вещь - вот здесь:
Код AS1/AS2:

btn.onPress = doIt;

в правой части не определяется никакая функция, а только для события onPress указываем ссылку на функцию doIt по ее имени.
Эта запись сродни
Код AS1/AS2:

a = b;

То есть присваиваем одной переменной ссылку на другую.


Часовой пояс GMT +4, время: 09:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.