Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Плавная смена картинок управляемая кнопками


Автор: Ghirik 21.9.2007, 01:14
Собственно, http://www.door-to.ru/LamerPhotoBlog/scripts/slide_click.htm только что из печки.... Кэширования картинок нет, потому в IE дергается.
Код

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>slideShow</title>
<script language="javascript">
<!--
a=5
t=6    //Время плавного появления/исчезновения
r=10    //Номер старшей картинки, нумерация начинается с 0.jpg, по умолчанию папка с картинками - img
a_i=new Array()
    for(c=0;c<=r;c++){
        a_i[c]=new Image()
        a_i[c].src='img/'+c+'.jpg'}

$=function(id){return document.getElementById(id)}

function slide_click(new_img){
        $('B1').disabled=true
        $('B2').disabled=true
    for    (var c=99;c>=0;c--){
        setTimeout(function (c,n){return function(){sets(c,n)}}(c,new_img),t*(100-c))}
    }
function sets(c,n){
    if    (c==0){
        $('slide').src=n.src
    for (c=1;c<=100;c++){
        setTimeout(function (c,n){return function(){sets(c,n)}}(c,n),t*c)
    if    (c==100){$('B1').disabled=false;$('B2').disabled=false;return}}
    }
    if    ($('slide').filters){
        $('slide').style.filter='alpha(opacity='+c+')'}
    else{
        $('slide').style.opacity=c/100}
    }
//-->
</script>
</head>
<body>
<br><img src=img/0.jpg id=slide align="left">
<input id="B1" type="button" value="Вперед" onclick="slide_click(a_i[a+=1])">
<input type="button" value="Назад" id="B2" onclick="slide_click(a_i[a-=1])">
</body>
</html>

Автор: dstorm81 21.9.2007, 08:55
Кэширования картинок нет, потому в IE дергается.

все дружно должны порадоваться?
я рад ;-)

Автор: dsCode 21.9.2007, 10:58
Ghirik, хороший скрипт =) думаю, пригодится в качестве примера, особенно новичками (только, если будете оформлять в виде примера/урока, - было бы хорошо написать все по стандартам, включая отступы и т.д., а так же имена переменных (осознанные, а не "a", "c", "r", намного удобней было бы "changeTime" вместо "t") и функций. Стандартизованный код и читать понятней (и приятней)). И можно в урок выкладывать =)

Автор: Ghirik 21.9.2007, 12:06
Цитата

Кэширования картинок нет, потому в IE дергается.

Просто сделать просили в соседней теме, под определенную задачу, для той задачи не нужно було кэшировать.

Цитата

было бы хорошо написать все по стандартам



dsCode, если не затруднит, переформатируйте пожалуйста по правилам, а то я не особо их знаю. smile на своём скрипте мне будет понятнее как нужно.

А для законченности скрипта, чуть позже, добавлю кэширование.

Автор: dsCode 21.9.2007, 13:07
Ghirik, что-то вроде этого:

Код

<script type="text/javascript">

  a = 5; // ! эта переменная тут зачем? Она не используется в коде
  
  var changeTime = 6; //Время плавного появления/исчезновения
  var parentPicNumber = 10; //Номер старшей картинки, нумерация начинается с 0.jpg, по умолчанию папка с картинками - img

  // можно и new Array(), но [] - удобней и быстрее,
  // а главное - профессиональней (не знаю, правильное утверждение или нет, но на мой взгляд - это так)
  var imagesArray = [];

  for (var c = 0; c <= parentPicNumber; c++) {
    imagesArray[c] = new Image();
    imagesArray[c].src = 'img/' + c + '.jpg';
  }

  /**
   * ну и немаловажны правильно оформленные комментарии
   * function gets object by id
   * можно указать параметры и возвращаемое значение
   * @param String id
   */

  $ = function(id) {
    return document.getElementById(id);
  }

  function slideСlick(newImg) {
    $('B1').disabled = true;
    $('B2').disabled = true;
    for (var c = 99; c >= 0; c--) {
      window.setTimeout(function (c, n) {
        return function() {
          sets(c, n);
        }
      }(c, newImg), t * (100 - c));
    }
  }

  function sets(c, n) {
    if (c == 0) {
      $('slide').src = n.src;
      // кто такой тут "с" в цикле? Переопределение параметра? 
     // Если просто счетчик цикла, то надо делать локальным:
     // var c, а не просто c
      for (c = 1; c <= 100; c++) {
        window.setTimeout(function(c, n) {
          return function() {
            sets(c, n);
            return true;
          }
        }(c, n), t * c);
        if (c == 100) {
          $('B1').disabled = false;
          $('B2').disabled = false;
          return;
        }
      }
    }
    if ($('slide').filters) {
      $('slide').style.filter = 'alpha(opacity=' + c + ')'
    } else {
      $('slide').style.opacity = c / 100;
    }
  }

//-->
</script>


Основные правила:

1. Всегда ставьте точку с запятой (пусть для js это не обязательно, но если Вы ее ставите - это признак хорошего тона).

2. Правильные отступы (во многих языках принято делать 2 или 4 отступа. В JavaScript, я, например, привык ставить 2 (исходя из кода больших фрейморков, да даже, если посмотреть js-фалы мозилы - там тоже 2 отступа. Хотя многие ставят 4 - это тоже правильно)). Кстати, есть такой замечательный язык как python, так вот там - отступы - это принудительное (и правильно!) правило. Если Вы ошибетесь с количеством отступов в строке - компилятор выдаст ошибку. Да и еще - никаких табов - все табы должны быть преобразованы в пробелы (потому что в Вашем редакторе табуляция может быть 2 символа, а в чьем-нибудь другом - 4 - и получится бредятина).

3. if ... else.. конструкции пишутся именно так, как в примере выше.

4. после знака припинания и разделителей всегда ставится пробел (for (var i = 0; i < 10; i++) а не for(var i=0;i<10;i++)).

5. Открывающая скобка блока или функции "{" может быть либо в той же строке, либо в новой. Это дело привычки (я привык всегда ставить в той же). Кстати, когда скобка ставится в новой строке - это "Классический способ", а если в той же - "Единственно верный" (название Денниса Ричи, одного из создателей языка Си).

6. имена переменных и функций начинаются с маленькой буквы, слова разделяются заглавными буквами: т.e. так myVar, myFunction(), а не my_var, my_function

7. Константы всегда пишутся большими буквами и разделяются подчеркиванием: MAX_VALUES, MIN_RANGE и т.д.

8. Внутри циклов нужно объявлять локальные переменные (они уничтожаться по выходу из блока), т.е. for (var c = 0...), а не for (c=0)...

Ну и т.д. Поищите нотации и документации по оформлению кода. Потому что неправильно оформленный код (даже, если Вы достигли уже больших успехов), всегда будет выдавать непрофессионала.

Автор: AKS 21.9.2007, 15:42
Цитата(dsCode @  21.9.2007,  13:07 Найти цитируемый пост)
эта переменная тут зачем? Она не используется в коде

Код

onclick="slide_click(a_i[a+=1])"



Цитата(dsCode @  21.9.2007,  13:07 Найти цитируемый пост)
Внутри циклов нужно объявлять локальные переменные (они уничтожаться по выходу из блока)

Уничтожаться по выходу из блока???

Цитата(Ghirik @  21.9.2007,  01:14 Найти цитируемый пост)
Собственно, скриптик.... только что из печки....

200 вызовов window.setTimeout и столько же вызовов анонимных функций для создания первого параметра в setTimeout - это не слишком много для одного преобразования?

Автор: dsCode 21.9.2007, 16:18
AKS, насчет переменной "а" - не заметил =) Ну это ерунда.


Цитата(AKS @  21.9.2007,  15:42 Найти цитируемый пост)
Уничтожаться по выходу из блока???


А что такое тройное удивление? Вообще (не касаемо конкретно JavaScript'a) - да, так оно и есть. Жизнь переменной определена ее блоком. С JavaScript'ом - да, ступил, переменная видна после цикла. Но в любом случае, если дело происходит в контексте функции, то использование в цикле var не "засорит" window по выходу из функции.

Автор: AKS 21.9.2007, 16:34
dsCode, 
Цитата
А что такое тройное удивление?

Просто подумал: "Неделю назад Ziroglif очень подробно рассказывал о жизни переменных"...

Ghirik,  вот так:
Код

onclick="slide_click(a_i[a+=1])"

возникает ошибка, если a становится < 0 или >= a_i.length...

Автор: dsCode 21.9.2007, 16:54
AKS, 
Цитата(AKS @  21.9.2007,  16:34 Найти цитируемый пост)
Просто подумал: "Неделю назад Ziroglif очень подробно рассказывал о жизни переменных"...

ладно, к словам не будем придираться, я говорил об оформлении кода в целом - это не только JavaScript'a касается =) Вот и упомянул, что локальная переменная уничтожится после выхода из блока (во всяком случае, в Си так). Да и в JavaScript так =) только вот цикл для нее - не "жизненный блок" получается, переменная объявляется в контексте функции и принадлежит функции (Variable Object функции, если точнее, но это не суть уже) =)

Автор: Ghirik 21.9.2007, 17:48
Всем большое спасибо!
Стало все понятно по форматированию. Впреть, обещаю выкладывать только нормально форматированный код.  smile  smile 
На самом деле мне не нравится растягивать код по вертикали, читаемость лучше, но анализировать работу кода неудобно. Приходится постоянно крутить колесо мышки, туда-сюда. Но попробую... Может и привыкну. 
Код

onclick="slide_click(a_i[a+=1])"

это я так... вообще, не думая.... smile торопился человеку ответить, ему нужно было только показать, кнопки у него свои.... Так то, можно конечно и по кругу картинки пустить. Наверно так и сделаю....

Автор: Zeroglif 21.9.2007, 18:45
Цитата(Ghirik @  21.9.2007,  18:48 Найти цитируемый пост)
обещаю выкладывать только нормально форматированный код.

Это хорошо. Вот http://forum.vingrad.ru/index.php?showtopic=120066&view=findpost&p=953781 были собраны ссылки "про стиль" по результатам небольшого http://forum.dklab.ru/other/all/RekomendatsiiISoobrageniyaOStileProgrammirovaniya.html на http://forum.dklab.ru/?c=10. 

Автор: cruelangel 21.9.2007, 20:53
>Всегда ставьте точку с запятой (пусть для js это не обязательно, но если Вы ее ставите - это признак хорошего тона).

ничего подобного. точкусзапятой лучше по возможности не ставить.

приведу пример:
Код
text= text
    .replace( /<br\/?>/gi, '\n' )


теперь мы можем добавить ещё один фильтр просто приписав его в конце..
Код
text= text
    .replace( /<br\/?>/gi, '\n' )
    .replace( /<[^<>]*>/g, '' )


если же нам придётся закомментить один из фильтров - достаточно просто его закомментить:
Код
text= text
//    .replace( /<br\/?>/gi, '\n' )
    .replace( /<[^<>]*>/g, '' )


точкисзяпятой же превращают редактирование в каторгу.


>в Вашем редакторе табуляция может быть 2 символа, а в чьем-нибудь другом - 4 - и получится бредятина

в случае отступов - ничего подобного. бредятина получается только в случае выравнивания участков строк табами. 


>после знака припинания и разделителей всегда ставится пробел (for (var i = 0; i < 10; i++) а не for(var i=0;i<10;i++)).

такой вариант смотрится ещё лучше: for( var i= 0; i < 10; ++i )


>локальная переменная уничтожится после выхода из блока (во всяком случае, в Си так

касательно конструкции for( int i=0; i < limit; ++i ) - будет ли i являться локальной для цикла, а не для функции - зависит от компилятора. 

Автор: dsCode 21.9.2007, 21:31
cruelangel, 
Цитата(cruelangel @  21.9.2007,  20:53 Найти цитируемый пост)
точкусзапятой лучше по возможности не ставить.


Цитата(cruelangel @  21.9.2007,  20:53 Найти цитируемый пост)
точкисзяпятой же превращают редактирование в каторгу.


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

Код

text = text
//    .replace( /<br\/?>/gi, '\n' )
    .replace( /<[^<>]*>/g, '' );


P.S. [1]: покажите мне хотя бы 50 человек, которые отрицают точку с запятой. Я покажу Вам 100, которые говорят о точке с запятой - почти как об обязательной сущности в javascript (опять же из этических соображений). Вообще, мои утверждения основываются на programming style guide'ах. Придерживаться или нет - Ваше дело. 

Цитата(cruelangel @  21.9.2007,  20:53 Найти цитируемый пост)
в случае отступов - ничего подобного. бредятина получается только в случае выравнивания участков строк табами.

на своей практике видел код, который редактировался в терминале в линухе - там смешались табы и пробелы - в EmEditor'e (редактор такой типа блокнота - кстати, хороший, им пользуюсь) потом сплошная каша получилась.

P.S. [2]: опять же - любой style guide порекомендует включить функцию "Преобразовывать табы в пробелы" в Вашем редакторе.

Цитата(cruelangel @  21.9.2007,  20:53 Найти цитируемый пост)
такой вариант смотрится ещё лучше: for( var i= 0; i < 10; ++i )

уф = ) устал ссылаться на style guide, но еще чуть-чуть =)) - после for - нужен пробел, после var i - нужен пробел.

Цитата(cruelangel @  21.9.2007,  20:53 Найти цитируемый пост)
касательно конструкции for( int i=0; i < limit; ++i ) - будет ли i являться локальной для цикла, а не для функции - зависит от компилятора.

не спорю, возможно и так (но в большинстве, которые я видел - переменная i - "исчезнет" после выхода из цикла). Приведите пример компилятора, о котором Вы говорите.

Автор: Ghirik 21.9.2007, 21:43
Сейчас занялся доработкой этого скриптика, блин(!) не узнаю свой код smile  smile 
Действительно, так отформатированный код приятно читать. Осталось только привыкнуть так форматировать самому... Я экономил буковы, чтобы текст получался меньше размером, интерпритатор всё же. А если использовать последующее сжатие, то усе путем. smile 

Автор: cruelangel 21.9.2007, 22:02
> Ради Бога, комментируйте, только хорошо бы (в конце!) поставить точку с запятой:

а при перекомментировании - не забыть перенести точкусзяпятой в нужное место... 


>Вообще, мои утверждения основываются на programming style guide'ах. 

я уже устал убеждать людей думать своей головой...  smile 


>уф = ) устал ссылаться на style guide, но еще чуть-чуть =)) - после for - нужен пробел, после var i - нужен пробел.

а обосновать сможешь, почему он там нужен?


>не спорю, возможно и так (но в большинстве, которые я видел - переменная i - "исчезнет" после выхода из цикла). Приведите пример компилятора, о котором Вы говорите.

msvc, емнип

Добавлено через 43 секунды
Ghirik, не экономь на спичках smile 

Автор: dsCode 21.9.2007, 23:35
cruelangel, 
Цитата(cruelangel @  21.9.2007,  22:02 Найти цитируемый пост)
я уже устал убеждать людей думать своей головой...

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

Цитата(cruelangel @  21.9.2007,  22:02 Найти цитируемый пост)
а обосновать сможешь, почему он там нужен?

конечно. - даже, хотя бы, по правилам грамматики =) к тому же - так, действительно, пишется (нравится Вам или нет, но по "правилам" - так пишется). По мне так - пишите хоть в одну строчку. "Правила" - в кавычках, потому что компилятору/интерпретатору по-барабану, собственно, как и Вам, я смотрю, однако, в и w3c и netscape'e и в borland'e и в microsoft и в sun и (т.д.) таки не лохи сидят тоже, чтобы придумывать "никому не нужные стайл-гайды", чтобы "гуру" вроде Вас просвещали людей и убеждали людей думать своей головой =). 

Автор: Zeroglif 21.9.2007, 23:35
Цитата(cruelangel @  21.9.2007,  21:53 Найти цитируемый пост)
ничего подобного. точку с запятой лучше по возможности не ставить

Чтобы её смело не ставить, нужно точно знать правила, когда это можно делать, а эти т.н. правила жутко описаны, сложная не до конца прописанная логика, и бьюсь об заклад, что вы не только не сможете обобщить правила ECMAScript 7.9 сходу прямо сейчас, но и не сделаете этого через неделю. Просто попробуйте. Если программист не понимает, как именно работает механизм automatic semicolon insertion (AIS), как он за ним по сути правит код (не зря это называли в старых доках compile-time error-correction, это именно исправление ошибок), то он рискует почём зря. B.Eich внедрил AIS спе-ци-аль-но, чтобы javascript щадил ошибающихся новичков и непрофессионалов, прощая им лысый код, вот пусть они друг другу такой всепрощающий стиль и советуют. Всем остальным точку с запятой нужно ставить обязательно, у такого подхода масса плюсов и чисто субъективные мизерные минусы, http://forum.dklab.ru/js/other/TochkaSZapyatoyVJavascript.html, не стану сильно повторяться...

Цитата(cruelangel @  21.9.2007,  23:02 Найти цитируемый пост)
а обосновать сможешь, почему он там нужен?

Чтобы помочь программистам любого уровня подготовки прочитать и разобрать написанное. Элементарно. Чем больше личного кривоколенного в коде, чем больше в нём игнора к привычным conventions с многолетней историей, тем сложнее глазам. И лезут мысли: "зачем это он в этом месте так завернул? - а чего это тут у него то так, то эдак? - отчего это он слепил всё в кучу? - что он этим хочет сказать-то? Вот и гадай потом, то ли это nOOb недоученный, то ли космический кодер, работающий в одиночку последние 70 земных лет...

Цитата(cruelangel @  21.9.2007,  23:02 Найти цитируемый пост)
я уже устал убеждать людей думать своей головой

Это точно, иногда руки опускаются.

p.s. Кстати, вот вам свежий пример отрицания глупых conventions - для цитирования на винграде есть соответствующая кнопка, ну, или можно руками прописать bbcodes... однако человек с головой всегда может на это не обращать внимание, не ему же читать.  smile 

Автор: Ghirik 21.9.2007, 23:53
 smile  smile  smile  smile  Или тему переименовывать пора smile 

Приятно послушать умных людей....

Автор: AKS 22.9.2007, 06:34
cruelangel, все же когда речь идет об общепризнанных стандартах (именно к ним и обратил изначально наши взоры dsCode), чье-либо "имхо", идущее вразрез, звучит невнятно и малоубедительно. Безусловно, всегда и всем полезно узнать еще одно личное мнение, но в подобных случаях оно должно быть высказано в более мягкой манере. И только тогда беседа будет протекать в нужном русле. 
В противном случае разговор может уйти вообще в другую сторону. Просто представьте, что ваша привычка редактировать код, при которой точка с запятой Вам мешает, у кого-нибудь вызовет смех, и он об этом тут же напишет. Или ваше мнение о том, что такая запись for( var i= 0; i < 10; ++i ) смотрится лучше, вызовет еще какую-либо бурную реакцию, о которой Вам тут же сообщат. Во что это все превратится? 
Нет уж, давайте так. Стандарты и те, кто соизволил нам о них рассказать какие-то подробности - "впереди, на лихом коне". Мы же с Вами, со своими "имхо", скромненько "семеним поодаль", выбирая вместо "а обосновать..., не экономь на спичках..., думать своей головой..." какие-нибудь другие подходящие, но деликатные фразы. smile

Автор: cruelangel 22.9.2007, 09:06
>> я уже устал убеждать людей думать своей головой...
> я бы воздержался от подобных заявлений (если это в мой адрес).

я себя тоже не люблю критиковать smile


> Чтобы её смело не ставить, нужно точно знать правила, когда это можно делать, а эти т.н. правила жутко описаны, сложная не до конца прописанная логика

ничего там сложного нет, просто примеров много...
там всего 3 правила:
1. если если после конструкции А идёт конструкция Б, которой по правилам не может идти после А, то между ними вставляется семиколон (если они разделены переводом строки, либо Б - это фигурная скобка)
2. в конце файла вставляем ; если её нет
3. частный случай первого правила
4. семиколон не вставляется автоматом там, где допускаются пустые выражения. например - внутри заголовка for
что тут сложного? вполне логичные, а главное _удобные_ правила.


> B.Eich внедрил AIS спе-ци-аль-но, чтобы javascript щадил ошибающихся новичков и непрофессионалов, прощая им лысый код

"For _convenience_, however, such semicolons may be omitted from the source text in certain situations."
один из примеров этого удобства я описал выше. я, кстати, ни в коем случае не предлагал опускать семиколон после однострочных выражений, если кто вдруг так подумал.


> зачем это он в этом месте так завернул? - а чего это тут у него то так, то эдак? - отчего это он слепил всё в кучу? - что он этим хочет сказать-то? Вот и гадай потом, то ли это nOOb недоученный, то ли космический кодер

1. я ни в коем случае не за раздолбайство, не надо проецировать на меня свои фобии smile нужно делать либо так, либо эдак, а не вперемежку.
2. какая разница нуб автор или космокодер? 


> Кстати, вот вам свежий пример отрицания глупых conventions - для цитирования на винграде есть соответствующая кнопка, ну, или можно руками прописать bbcodes

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


>>> после for - нужен пробел, после var i - нужен пробел.
>> а обосновать сможешь, почему он там нужен?
> даже, хотя бы, по правилам грамматики
> Чтобы помочь программистам любого уровня подготовки прочитать и разобрать написанное.

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

Автор: dsCode 22.9.2007, 11:38
cruelangel, 
Цитата(cruelangel @  22.9.2007,  09:06 Найти цитируемый пост)
нет, пробелы там нужны, чтобы визуально отделять самостоятельные части выражения. при этом нет особого смысла отделять for от круглой скобки - причина та же, что и для вызова функции - подчёркивается зависимость от параметров. оператор присванивания лучше писать без пробелов слева, дабы подчеркнуть, что происходит именно присваивание, а не сравнение, и то, что находящееся слева выражение должно быть ссылкой на переменную, а не что попало, как в случае с правым.

я вот думаю, откуда из Вас прут такие утвердительные фразы? Как не крути - это всего лишь какие-то Ваши прихоти и, действительно, малообоснованные амбиции, которые выдаются в утвердительной форме за истину. Вот как это вообще так бывает, объясните мне? Дело даже не в convention'aх, дело в том, что по моему мнению Вы возомнили здесь некто большего о себе, кем являетесь, утверждая (я опять повторяю - утверждая и выдавая за истину (!), а не предлагая (!)) что мы тут "ограниченные стайл-гайдами и конвеншнами люди, которых надо учить думать своей головой", а Вы -  "гуру-бунтарь, который познал истину и сейчас всех научит" =))) Вот боюсь огорчить - хрен =) Видал я таких людей - большинство из них были жуткими дилетантами в своем деле.

Если Вы не понимаете (или не знаете) зачем нужны те или иные вещи, то это не значит еще, что они плохие.

P.S.: "Безумец говорит, что люди его не знают, мудрец говорит, что он не знает людей" (С) кто-то там.. 

Автор: cruelangel 22.9.2007, 12:23
и в какой же форме мне надлежит приводить свои аргументы? в вопросительной? или же вообще, как ты, не приводить ни одного,  а целиком сконцентрироваться на окунании оппонента в грязь?

Автор: SelenIT 22.9.2007, 12:29

Сорри за небольшой smile 
cruelangel, про кнопку для цитирования: она находится над каждым сообщением справа. Работает так: выделяете фрагмент сообщения, кликаете "быстрая цитата" для этого сообщения - и в форме быстрого ответа внизу страницы у Вас готовый BB-код для красиво отформатированной и подписанной цитаты, даже со ссылкой на первоисточник;). Можете копировать его хоть в другое окно, хоть куда...

Автор: cruelangel 22.9.2007, 12:34
спасибо, конечно, но я всё это прекрасно знаю. это удобно только при ответе на одну единственную реплику. при ответе на несколько - приходится туда-сюда мотать страницу.

Автор: SelenIT 22.9.2007, 12:43
Чтоб скопировать реплики для отквочивания в стиле ">>>", ее все равно приходится мотать... где же выигрыш? Или я совсем чего-то очевидного не понимаю...

Автор: dsCode 22.9.2007, 12:45
Цитата(cruelangel @  22.9.2007,  12:23 Найти цитируемый пост)
и в какой же форме мне надлежит приводить свои аргументы?

в "предлагательной" (название-то какое =)). Причем, с пометкой, aka "я вот знаю, что надо так и так, но у меня есть идеи получше". Вот потом посмотрите, что скажут о Ваших "получше". Максимум что скажут - пишите, Ваше дело, но в профессиональном почерке подобное недопустимо. Другой способ - найдите хотя бы несколько тысяч соратников, сделайте новый стиль и напишите свой гайд. Если он будет удобный, хороший и непротиворечивый - я приму его.

Цитата(cruelangel @  22.9.2007,  12:23 Найти цитируемый пост)
или же вообще, как ты, не приводить ни одного,  а целиком сконцентрироваться на окунании оппонента в грязь?


во-первых: я к Вам на Вы, б*я. smile

во-вторых: если ты привык окунать людей в грязь (причем аргументируя дешевым навязыванием своих привычек в неправильном коде), то это не значит, что и другие действуют так же.

во-третьих: я привел немало аргументов.

в-четвертых: разговор окончен.

Автор: cruelangel 22.9.2007, 12:58
SelenIT, я ничего не мотаю - я просто не пользуюсь быстрым ответом при написании ответа


dsCode, упование на дяденек, которые за тебя всё решили, не есть аргумент. ты почитай мозилловский стайл-гайд - это просто ужос какой-то

Код
fooMethod(a1,         // bad
    v2);
fooMethod(a1,         // OK
          v2);


Код
if (foo.bar(twok())) {       // OK

Автор: Zeroglif 22.9.2007, 15:04
Цитата(cruelangel @  22.9.2007,  10:06 Найти цитируемый пост)
ичего там сложного нет, просто примеров много... там всего 3 правила

Я ж говорю, не сможете обобщить и не обобщили. Правила вами приведены/сокращены очень уж неточно, во-вторых, даже если бы вы запостили этот пункт ECMAScript целиком (в оригинале), то сразу встал бы вопрос, кто есть "offending token" и что это за "certain situations" с этими токенами? Ньюб совершенно не в состоянии держать в голове список из энного количества конструкций, обслуживаемых ASI (automatic semicolon insertion), а более опытный программист просто не нуждается в такой картине, дисциплинированно отбивая точку с запятой там, где в соответствии со стандартом что-то "must be terminated with semicolons". 

Цитата(cruelangel @  22.9.2007,  10:06 Найти цитируемый пост)
"For _convenience_, however, such semicolons may be omitted from the source text in certain situations."

Здесь важно понимать, кого держал в уме автор языка, предлагая нам  сие удобство:
<...> my intention was to appeal to novice programmers and even stone-cold beginners. I wanted syntax that was not so terse and punctuator-prone <...> I could not use a natural-language syntax a la HyperTalk because management here argued convincingly that JS must look like Java.  So I scaled back ease-of-use to the automatic semicolon insertion algorithms<...>
/B.Eich в ньюсах/

Цитата(cruelangel @  22.9.2007,  10:06 Найти цитируемый пост)
я ни в коем случае не за раздолбайство

Призыв "За Раздолбайство! - это, цитирую: "ничего подобного. точку с запятой лучше по возможности не ставить."

Цитата(cruelangel @  22.9.2007,  10:06 Найти цитируемый пост)
какая разница нуб автор или космокодер?

Первого ещё можно вернуть в социум, второй - упрётся рогом, поотрицает солнце... и снова улетит к себе.

Цитата(cruelangel @  22.9.2007,  10:06 Найти цитируемый пост)
оператор присванивания лучше писать без пробелов слева, дабы подчеркнуть, что происходит именно присваивание, а не сравнение

Если оставить пробел, то это станет сравнением или станет похожим на сравнение?  smile 

Цитата(cruelangel @  22.9.2007,  10:06 Найти цитируемый пост)
что находящееся слева выражение должно быть ссылкой на переменную

А разве должно? Не должно, ну, вычислится между делом Reference type, но это и так ясно из оператора, отсутствие пробела ничего не подчёркивает вообще.

Автор: cruelangel 22.9.2007, 18:20
> Правила вами приведены/сокращены очень уж неточно

где я конкретно ошибся?


> Здесь важно понимать, кого держал в уме автор языка, предлагая нам  сие удобство

в приведённой цитате авто сожалеет, что не может сделать синтаксис а-ля HyperTalk (то есть без лишних знаков препинаний), потому как начальство требует синтаксис похожий на яву, и отмечает, что придумал простое решение позволяющее в некоторых случаях опускать семиколоны. если бы не начальство со своей явой яваскрипт мог бы выглядеть так: 
Код
 on mouseUp
   put "100,100" into pos
   repeat with x = 1 to the number of card buttons
     set the location of card button x to pos
     add 15 to item 1 of pos
   end repeat
 end mouseUp
 ибо он стремился сделать лёгкий в освоении язык. именно в этом контексте он ведёт речь о новичках, а не в таком, как понял его ты - "пусть новички пишут как попало, а мы будем гадать на кофейной гуще".


> Призыв "За Раздолбайство! - это, цитирую: "ничего подобного. точку с запятой лучше по возможности не ставить."

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


>Если оставить пробел, то это станет сравнением или станет похожим на сравнение?
>А разве должно? Не должно, ну, вычислится между делом Reference type, но это и так ясно из оператора, отсутствие пробела ничего не подчёркивает вообще.

( a == b ) - симметричен относительно равенства, операнды равноправны, происходит сравнение a с b или b с a  - не важно
( a= b ) - ассиметричен относительно равенства, операнды неравноправны, происходит присваивание первому операнду значения второго (указатель на переменную как бы открывает слот на запись идущего далее потока данных )

Автор: Ghirik 22.9.2007, 18:57
cruelangel, почему у Вас настолько пренебрежительное отноше к собравшимся на этом форуме? Я понимаю, если Вы не знаете, как цитировать сообщения, но Вы принципиально наплевали на всех присутствующих и не выделяете цитаты. Лишь бы Вам было удобно... Вы в жизни так всегда поступаете?

Автор: cruelangel 22.9.2007, 19:15
я выделяю цитаты вполне стандартным способом - угловой скобкой. в правилах я не заметил указания использовать исключительно бб-синтаксис. плохо смотрел?

Автор: Zeroglif 22.9.2007, 21:07
Цитата(cruelangel @  22.9.2007,  19:20 Найти цитируемый пост)
где я конкретно ошибся?

Надо в левую руку взять свой текст, а в правую текст ES... и неточности откроются. Так быстрее, чем я буду переписывать написанное. smile

Цитата(cruelangel @  22.9.2007,  19:20 Найти цитируемый пост)
а не в таком, как понял его ты - "пусть новички пишут как попало, а мы будем гадать на кофейной гуще"

А я так понял, да?  smile  В общем, "лёгким в освоении" по-твоему - это значит не для полных ньюбов и создателей тогдашних хоумпагов середины 90-x, а для переходящих на язык программёров, которых точка с запятой могла поставить в тупик. Чтоб им легче было из тупика выйти. В общем, это для них.

Цитата(cruelangel @  22.9.2007,  19:20 Найти цитируемый пост)
это пока это не противоречит синтаксису и наглядности

Наглядность - вещь субъективная, а вот противоречия надо знать, отсюда попробую повторить вопрос: что такое "offending token" конкретно? А заодно: есть ли баги, связанные непосредственно с реализацией ASI в движках?

Цитата(cruelangel @  22.9.2007,  19:20 Найти цитируемый пост)
симметричен относительно равенства

Цитата(cruelangel @  22.9.2007,  19:20 Найти цитируемый пост)
ассиметричен относительно равенства

LOL. То есть ты предлагаешь, удавливая пробел слева, бороться против ужасного наследия Fortran-a? Все на борьбу со знаком равно, который, чёрт побери, никакой не знак равно! Что ж, тоже подход, может, кого и увлечёшь...

Автор: cruelangel 23.9.2007, 11:47
> что такое "offending token" конкретно? 

в тексте он встречается 4 раза, при этом первое вхождение - его определение, отражённое мною в первом правиле. в общем, могу констатировать факт чтения тобой стандарта по диагонали. 


> Все на борьбу со знаком равно, который, чёрт побери, никакой не знак равно!

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


> есть ли баги, связанные непосредственно с реализацией ASI в движках?

мне о таковых не известно.

Автор: Zeroglif 23.9.2007, 12:54
Цитата(cruelangel @  23.9.2007,  12:47 Найти цитируемый пост)
могу констатировать факт чтения тобой стандарта по диагонали

Погоди констатировать, ты мне всё-таки ответь, что такое "offending token". Не в общем смысле... токен, который "is not allowed by any production of the grammar", а КОНКРЕТНО, как знаток стандарта ты же должен всё это знать досконально (а не искать по тексту вхождения фразы), что же и где конкретно не разрешено, ты же считаешь эти правила простыми, поясни. Иначе грош цена твоей позиции.

А констатировать я и сам умею, на базе твоих здешних сомнительных обобщений и неказистых терминов любой другой тебя уже давно записал бы в касту js-ньюбов, но поскольку всякая публичная дискуссия самоценна, не имею ничего против того, что я читал стандарт один раз и по диагонали, а ты его большой знаток. Отсюда настойчивая просьба к специалисту - грамотно опиши/обобщи правила ASI (их нигде нет на русском, будешь первым), а самое главное - их растолкуй, в частности, как же нам бодаться с этим "offending token", как отличать от простого "token".

p.s. Пока ты этого не сделаешь, мне сложно будет тебе довериться и... придётся повесить ярлычок...  smile 

Автор: cruelangel 23.9.2007, 13:34
я уже обобщил эти правила на предыдущей странице, причём никаких "offending token" я не употреблял. если что-то не понятно - спрашивай. если нужны примеры - в стандарте их полно, причём с пояснениями. если увидел ошибку - скажи где и какую.

ps: в сим стандарте я читал исключительно пункт 7.9, специально, чтобы была аргументация в этом споре. однако это не мешает мне писать программы на жабаскрипте, в том числе и с применением ASI и других фишек оного... 

Автор: Zeroglif 23.9.2007, 14:16
Цитата(cruelangel @  23.9.2007,  14:34 Найти цитируемый пост)
если что-то не понятно - спрашивай

Непонятно. Спрашиваю...

Цитата

1. если если после конструкции А идёт конструкция Б, которой по правилам не может идти после А, то между ними вставляется семиколон (если они разделены переводом строки, либо Б - это фигурная скобка)

- что такое "конструкция"?
- как конкретизировать "по правилам не может идти"?
- по каким признакам мне отличить "не может идти" от "может идти"?
- фигурная скобка любая?

Цитата

2. в конце файла вставляем ; если её нет

- какого файла?
- где в оригинале "если её нет"?

Цитата

3. частный случай первого правила

- что это за частный случай?
- есть ещё подвид "конструкций", которые "по правилам не могут идти"?

Цитата

4. семиколон не вставляется автоматом там, где допускаются пустые выражения. например - внутри заголовка for

- в ECMAScript есть пустые выражения?
- где в оригинале "там, где допускаются", где они вообще допускаются?
- внутри for Statement есть empty Statement?

Опиши, наконец, грамотно правила ASI. Опиши, наконец, грамотно, что есть "offending token". C позиции знатока ASI, которую ты отстаиваешь.

Автор: cruelangel 23.9.2007, 16:13
> что такое "конструкция"?

"Input elements other than white space and comments form the terminal symbols for the syntactic
grammar for ECMAScript and are called ECMAScript tokens."


> как конкретизировать "по правилам не может идти"?

это значит, что нет грамматических правил это допускающих.


> по каким признакам мне отличить "не может идти" от "может идти"?

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


> фигурная скобка любая?

только закрывающая


> какого файла

он же входной яваскрипт поток, он же строка содержащая программу на языке яваскрипт. 


> где в оригинале "если её нет"

"When, as the program is parsed from left to right, the end of the input stream of tokens is
encountered and the parser is unable to parse the input token stream as a single complete
ECMAScript Program, then a semicolon is automatically inserted at the end of the input stream."
смысл тот же.


> что это за частный случай?
> есть ещё подвид "конструкций", которые "по правилам не могут идти"?

по правилам параметр для таких операторов как return, break и тп не может быть отделён переводом строки. 


> в ECMAScript есть пустые выражения?

в данном контексте разница между "выражениями" и "утверждениями" не существенна.


> где в оригинале "там, где допускаются", где они вообще допускаются?

"However, there is an additional overriding condition on the preceding rules: a semicolon is never
inserted automatically if the semicolon would then be parsed as an empty statement or if that semicolon
would become one of the two semicolons in the header of a for statement (section 12.6.3)."
смысл тот же


>внутри for Statement есть empty Statement?

как я уже сказал - разница не существена.


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



Автор: Zeroglif 23.9.2007, 17:54
Что и ожидалось. От ошибок и терминологической путаницы своими словами ты перешёл к плотному цитированию оригинала абзацами.  Правильно, так безопаснее. Как и с точкой с запятой. smile 

Цитата(cruelangel @  23.9.2007,  17:13 Найти цитируемый пост)
разница не существена

Цитата(cruelangel @  23.9.2007,  17:13 Найти цитируемый пост)
нужно знать грамматику

Цитата(cruelangel @  23.9.2007,  17:13 Найти цитируемый пост)
попробовать и посмотреть что получится

Цитата(cruelangel @  23.9.2007,  17:13 Найти цитируемый пост)
смысл тот же

 smile  smile  smile 


Автор: babe 25.9.2007, 14:03
Господа, извините, слегка отвлеку Васsmile 
хотелось бы спросить у гуру - не является ли более правильным написание:

не 
Код

for(var i...){
 ...
}

а 
Код

var i;
for(i...){
 ...
}

Заранее благодарна за аргументированный ответ smile 

Автор: Ghirik 25.9.2007, 14:06
У Гуру, наверное другое мнение, а по мне, дак хрен редьки не слаще... smile 

Автор: dsCode 25.9.2007, 14:12
babe, с технической точки зрения - без разницы - в обоих случаях "i" будет принадлежать контексту, где происходит действие (функция или глобально - window). С "психологической" - второй вариант более подходит для случая, если "i" будет использоваться в дальнейшем (за рамками цикла) (еще раз повторю - первый случай тоже для этого подходит, но во втором - явно (для себя) указывается, что с "i" будут происходить какие-то действия и дальше). Хотя, это всего лишь ИМХО-шная "психологическая" сторона. Вполне может быть, что человек просто захотел объявить все переменные вначале и дальше уже работать (а будь то переменная только для цикла или еще для чего - не важно уже).

P.S.: Исходя из практики в других языках программирования (например, Си.. поправка - компиляторов для Си, с которыми я сталкивался, поскольку в этой теме высказывалась мысль, что не во всех "Си" так. Но, я склоняюсь, что в 90%) - первый вариант более правильный, т.к. переменная уничтожается сразу по выходу из цикла. Если он объявлена выше, то будет в памяти до выхода из блока, где объявлена. К JavaScript это не относится, но все же, я, например, и здесь приучил себя писать так (хотя, это в JavaScript (третий раз повторю =)) никак не повлияет на область видимости "i") =)

Автор: Ghirik 25.9.2007, 14:20
dsCode, умеете же Вы всё разложить по полочкам... smile 

Автор: babe 25.9.2007, 14:20
спасибо за отклик  smile  
я между прочим спрашиваю как раз с технической точки зрения:
потому что если в цикле 10000 итераций разве не рентабельнее и идеологически правильнее было бы переменную объявить ОДИН раз (то есть ОДИН раз выделить под нее память), а не 10000 раз?

Автор: Ghirik 25.9.2007, 14:26
Цитата

объявить ОДИН раз


Она в любом случае объявляется один раз. А далее, в цикле не участвует.
Если бы она объявлялась 10000 раз, то всегда имела бы одно и то же значение...

Автор: dsCode 25.9.2007, 14:33
babe, 

Цитата(babe @  25.9.2007,  14:20 Найти цитируемый пост)
потому что если в цикле 10000 итераций разве не рентабельнее и идеологически правильнее было бы переменную объявить ОДИН раз (то есть ОДИН раз выделить под нее память), а не 10000 раз?


Она объявится один раз. Конструкция for выглядит так:

for (блок_объявления_и_начальной_инициализации ; блок_условия_окончания_цикла ; блок_"изменения_параметров_условий" )

Как видите - переменная объявится один раз, потому что цикличен именно последний блок (на основе блока #2). В последнем блоке "изменения_параметров_условий" взято в кавычки, поскольку это "в классическом" стиле, на самом деле там может находится любая реализация. В принципе, любой из этих блоков - опциональный. Например, блок инициализации может быть пустым, если Вы воспользуетесь первым случаем:

Код

var i = 0;

for (; i < 10; i++) {
  ...
}


P.S.: пока писал, Ghirik уже рассказал все =)

Автор: babe 25.9.2007, 14:45
спасибо большое))) действительно) стало понятно почему один раз)) smile 
P.S. пожалуйста, не ссорьтесь друг с другом на столь замечательном ресурсе smile 

Автор: Ghirik 25.9.2007, 15:31
Цитата

P.S. пожалуйста, не ссорьтесь друг с другом на столь замечательном ресурсе


Ага... Хулиганят.... Будь то корову делят...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)