1. ActionScript / Говнокод #15695

    −136

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    /**
     *  @private
     *  Calculates the height needed for heightInLines lines using the default
     *  font.
     */
    private function calculateHeightInLines():Number
    {
        var height:Number = getStyle("paddingTop") + getStyle("paddingBottom");
        
        if (_heightInLines == 0)
            return height;
        
        var effectiveHeightInLines:int;
        
        // If both height and width are NaN use 10 lines.  Otherwise if 
        // only height is NaN, use 1.
        if (isNaN(_heightInLines))
            effectiveHeightInLines = isNaN(_widthInChars) ? 10 : 1;   
        else
            effectiveHeightInLines = _heightInLines;
        
        // Position of the baseline of first line in the container.
        value = getStyle("firstBaselineOffset");
        if (value == lineHeight)
            height += lineHeight;
        else if (value is Number)
            height += Number(value);
        else
            height += ascent;
        
        // Distance from baseline to baseline.  Can be +/- number or 
        // or +/- percent (in form "120%") or "undefined".  
        if (effectiveHeightInLines > 1)
        {
            var value:Object = getStyle("lineHeight");     
            var lineHeight:Number =
                RichEditableText.getNumberOrPercentOf(value, getStyle("fontSize"));
            
            // Default is 120%
            if (isNaN(lineHeight))
                lineHeight = getStyle("fontSize") * 1.2;
            
            height += (effectiveHeightInLines - 1) * lineHeight;
        }            
        
        // Add in descent of last line.
        height += descent;              
        
        return height;
    }

    Внимательно следим за жизненным циклом переменной lineHeight.

    Запостил: wvxvw, 07 Апреля 2014

    Комментарии (17) RSS

    • Вот за это я и не люблю скопы в жс ;)
      Ответить
      • А кто их любит?
        Ответить
        • Ну есть же жсофаги, которым нравится анальный секс яваскрипт, и которые защищают каждую его говнофичу, утверждая, что жсхейтеры просто не понимают идей, заложенных в этот прекрасный язык...
          Ответить
    • Я не понял, они типа до инициализации используют переменную? Или тут порядок исполнения немного не такой, как написано?
      Ответить
      • Да. в жабоскрипте (и пистоне) не осилили local из lua.
        Ответить
        • В питоне при подобном сценарии будет громкий UnboundLocalError.
          Ответить
      • Самый лол в том, что var, приписанный к имени переменной действует на протяжении всей функции (да, даже вверх). И означает он не совсем не объявление переменной, а то, что эта переменная будет локальной (да-да, если не написать var ни разу - юзаться будет глобалка). Скоп у каждой функции только один, блоки новый скоп не заводят... Ёбаный пиздец...

        Порядок исполнения такой же как всегда, просто изначально в переменной будет валяться undefined (или я туплю насчет undefined?).

        Как-то так...
        Ответить
        • Да, undefined.
          Ответить
        • Скопы жс на примерах:
          function test() {
              // пишем в глобальную переменную (ок, если быть точным - в поле глобального объекта)
              // в случае с браузерами - global object это window, а запишем мы в window.shit
              shit = 42; 
              // а это запись в локальную(!) переменную...
              hate = 100500;
              for (var i = 0; i < 10; i++) {
                  // ... потому что вот в этой строке написано var hate
                  // причем этот var не объявляет новую переменную, локальную для блока ...
                  var hate = 5;
              }
              // ... поэтому здесь мы увидим пятерку, а не 100500
              alert(hate);
          }
          
          test();
          
          alert(shit); // здесь 42
          alert(window.shit); // и здесь 42
          Ответить
          • Не всё так плохо для олдфагов:
            > (function(){ 'use strict'; a = 5; })()
            ReferenceError: a is not defined
            > (function(){ a = 5; })()
            undefined

            А вроде бы ещё в ES6 переменные и функции будут жить в своём блоке
            Хотя, let в Firefox уже есть.
            Ответить
            • > 'use strict'
              Блеать... Строковый литерал, висящий в воздухе... Отличный способ для активации нового функционала... Жс не перестает удивлять своими костылями :)

              > let в Firefox уже есть
              Ну это, конечно, не может не радовать... Вот только юзать его никто не будет, разве что нодовцы. А остальным придется и дальше кушать кактус, пока все браузеры начнут поддерживать ES6 ;)
              Ответить
              • Обратная совместимость-с. Всяко лучше, чем ничего.

                P.S. Плюс это не совсем новый функционал. Он не добавляет ничего нового, а наоборот, закрывает старые неудачные дизайнерские решения.
                Ответить
              • Есть еще браузерозависимый "use asm" :)
                Ответить
        • Будет NaN в этом случае, т.как указан тип. Но может быть так же null, или 0, кроме undefined, в зависимости от типа.
          Ответить
          • Это в AS так? В обычном жс же типов нет.
            Ответить
            • Это жс 4, который недолго пожил в Мозилле, и на долго остался во Флеше.
              Ответить

    Добавить комментарий