Блоки в JavaScript

    Привет, Хабрачитатель!

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

    Суть мысли, или даже вопроса — почему никто (встречавшийся мне) не использует отдельные блоки кода (помимо тех, которые используются с выражениями if else и т.д.) в своих JavaScript приложениях?

    Как создать блок кода в JavaScript?


    Легко! {} в начале выражения считается блоком (а не объектом). Например:
    {
        console.log('Hello from a block');
    }
    

    Чем может быть полезен блок?


    В JavaScript блоки кода не создают свою область видимости (скоуп), поэтому будем искать полезность в чем-то другом.
    Самое элементарное применение — разделение логических частей кода. Да еще какое! Блок можно использовать с меткой.
    MyBlock: {
        console.log('This is MyBlock');
    }
    

    Толку с нее в данной ситуации мало. С таким успехом можно заменить метку на комментарий, но ведь как красиво смотрится.
    Но остается проблема в ограниченности метки.

    Опытный и не очень программист может сказать — все логичные блоки / части кода лучше выносить в отдельные функции. Но попробую сразу же не согласиться. Давайте рассмотрим пример из жизни?
    Допустим, есть у меня Backbone приложение. При инициализации каждой view я должен совершать стандартные действия: подписываться на глобальные события, подписываться на изменения модели или коллекции и т.д.
    Backbone.View.extend({
        initialize: function () {
            this.model.on('change', this.render);
            this.model.on('add', this.onAdd);
            this.model.on('change:type', this.onResetType);
            app.subscribe('reload', this.render, this);
            app.subscribe('remove', this.remove, this);
            app.subscribe('vodka', this.drink, this);
        }
    });
    

    Почему-то я не хочу выносить это в отдельные функции. Я привык, что в методе initialize я могу увидеть сразу подписку на все нужные события.
    Так почему же мне не разделить эту массу кода на отдельные логические блоки кода в рамках одного метода и скоупа?
    Backbone.View.extend({
        initialize: function () {
            ModelEvents: {
                this.model.on('change', this.render);
                this.model.on('add', this.onAdd);
                this.model.on('change:type', this.onResetType);
            }
            AppEvents: {
                app.subscribe('reload', this.render, this);
                app.subscribe('remove', this.remove, this);
                app.subscribe('vodka', this.drink, this);
            }
        }
    });
    


    Недостатки


    Даже не знаю, какие могут быть недостатки у такого способа разделения кода. Быть может, есть вероятность того, что можно запутаться — перепутать блок кода с объектом. Но у меня такой наклонности не возникает.

    Вывод: использовать такие блоки — дело выбора каждого. Комментарии, блоки — кому как нравится. Но хотелось бы все же найти интересное применение таким блокам.

    Всем спасибо за внимание.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 10

      +3
      Единственное место, где я видел использование меток и блоков кода был wtfjs.com

                 function f1(f,t) { t:{ f(t) } }
      
        +23
        В JS и так, имхо, уровней и скобок многовато часто получается, а вы еще предлагаете… И неоднозначноть со областями видимости (не все пишут только на JS).
        Backbone.View.extend({
            initialize: function () {
                // Model Events
                this.model.on('change', this.render);
                this.model.on('add', this.onAdd);
                this.model.on('change:type', this.onResetType);
        
                // App Events
                app.subscribe('reload', this.render, this);
                app.subscribe('remove', this.remove, this);
                app.subscribe('vodka', this.drink, this);
            }
        });
        

        Чем хуже?
          +5
          Поддерживаю это мнение. Комментарием проще обозначить смысл кода, чем меткою ко блоку, ещё и потому, что в комментарии можно употреблять какие угодно символы (а не только допустимые при записи идентификаторов), так что язык его бывает более естественен. Притом блок нужно обрамлять с двух сторон фигурными скобками, тогда как комментарию достаточно одной строки (его собственной), как правило; если же комментарий всё же получается длинным, то его можно сделать многострочным, тогда как с меткою это далеко не просто сделать.
            +2
            Поддерживаю оба мнения. Еще о блоках в JavaScript многие просто не знают и при виде
            MyBlock: {
                console.log('This is MyBlock');
            }
            

            возникнет вопрос «эээ что это??? а так можно?» и человеку придется разбираться. Сегодня как правило, во всех ЯП большие блоки «именуют» путем выноса в отдельную функцию. Вы же не пишете код для себя ;-)
          +3
          Если вам хочется сплошной кусок кода разбить на блоки, а тем более уровни, то это отличный индикатор того, что вы что-то делаете не так.
          • UFO just landed and posted this here
            +1
            Меня эти метки скорее запутывают.

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

            p.s. у меня при виде различного рода «меток» начинается паника, после того как в своё время допиливал чужой C++ код с кучей goto )=
              +1
              Тоже самое работает во многих языках, например, в Java и PHP:

              public class HelloWorld{
              
                   public static void main(String []args){
                     {
                     	 System.out.println("Block 1");
                       label: {
                         System.out.println("Block 2");
                       }
                     }
                   }
              } 
              
              // Output
              // Block 1
              // Block 2
              


              <?php
              
              {
              	echo 'Block 1'.PHP_EOL;
                  {
                  	echo 'Block 2'.PHP_EOL;
                  }
                  label: {
                  	echo 'Block 3'.PHP_EOL;
                  }
                  label2:
                  	echo 'Block 4'.PHP_EOL;
                  
              }
              
              // Output
              // Block 1
              // Block 2
              // Block 3
              // Block 4
              
                +4
                > Суть мысли, или даже вопроса — почему никто (встречавшийся мне) не использует блоки кода в своих JavaScript приложениях?

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

                Другое дело, что в использовании блоков самих по себе без какого-то предстоящего перед ними выражения нет особого смысла, потому что способов группировки — масса.

                Мне кажется тут надо следовать правилу «Бритва Оккама» — не надо плодить лишние сущности без надобности.
                  +2
                  Единственное, пожалуй, применение этих самых блоков — фолдинг кода.

                  Only users with full accounts can post comments. Log in, please.