1. JavaScript / Говнокод #11747

    +154

    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
    function highlight(a, b) {
      if (b == 2) {
        var c = a.parentNode.parentNode
      }
      if (b == 3) {
        var c = a.parentNode.parentNode.parentNode
      }
      if (b == 4) {
        var c = a.parentNode.parentNode.parentNode.parentNode
      }
      addClassName(c, "focused", true);
      var d = getElementsByClassName(document, "*", "focused");
      for (i = 0; i < d.length; i++) {
        if (d[i] != c) {
          removeClassName(d[i], "focused")
        }
      }
    }

    норм, 4 уровня родители, вычисление длины массива в цикле d.length и какая то бессмысленная проверка if (d[i] != c), куча var, в общем буээ
    http://www.flatsoft.com/js/wufoo.min.js

    Запостил: nur, 11 Сентября 2012

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

    • А как обойтись без var? И предложи свой вариант как убрать focused со всех и поставить заданному. У меня javascript пока на начальном уровне и я не знаю тонкостей его работы, но я реализовал бы задачу примерно так же.
      Ответить
      • Помнить последний, на котором был фокус, и с него же и убирать. Так, вобщем, фокус-менеджер работает в нескольких ГУИ системах, с которыми приходилось работать.

        var в ЯваСкрипте по правилам хорошего тона пишут один раз в функции, в самом верху. Есть люди, которым правила хорошего тона не нравятся, но меня, например, коробит, когда var используют где-то внутри блоков. Это потому, что все локальные переменные функции интерпретатором все равно "объявляются" в самом начале. Два раза объявлять одну и ту же переменную, как это сделано здесь - нет смысла / только путает. Ну и вообще, не понятно, чего ожидал автор когда, например, случилось бы, что b = 5.
        Ответить
        • Вот кстати вспоминается, как я заюзал var в js первый раз... функция упорно не хотела работать правильно, и в конце-концов я выматерился, разобравшись что там нихрена не лексическая область видимости, а один словарь на всю функцию...

          Поэтому я тоже двумя руками за правило "писать var в начале функции".
          Ответить
          • Да уж, после С и Ко вещи типа { var a = ....; } смотрятся дико.
            Ответить
            • А еще можно запросто забыть занести переменную в var, и получить тем самым глобальную переменную, и радости отладки...

              Мое имхо - лучше бы глобальные переменные помечались кейвордом var (или global), а остальные имели бы лексическую видимость. Так было бы интуитивнее и безопаснее.
              Ответить
              • Лучше бы они не хуйню делали в новых стандартах (они где-то пытались фиксить эти проблему с переменными то ли 1.6 то ли 1.7), а запилили как в скале val - константа.
                Ответить
              • https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7
                Во. let сделали.
                Ответить
                • let (x=1, y=2) {
                      // ...
                  }
                  очень похоже на хаскелевский let.
                  Ответить
                  • По мне, так это больше похоже на let из clojure.
                    Я понял почему вы так подумали.
                    { для вас аналог in, но семантически это не так.
                    В хаскеле let ... in x вертает x, в то время как в этом языке let ... {} вертает условно говоря void.
                    Ответить
                    • > это больше похоже на let из clojure
                      В clojure (да и вообще во всех лиспах) let работается также, как и в Haskell, т.е. возвращает выражение.
                      Cхожесть, видимо, в том, что изменяется привязка имён в рамках куска кода. Однако же хаскелевский let тоже может временно менять биндинги переменных, хотя это обычно и не желательно. Если, конечно, в JavaScript не ввели динамическую область видимости переменных.
                      Ответить
                  • Если уже искать аналог, то это let из bash. Там как раз так и работает.
                    Ответить
        • Про var в начале - поддерживаю. Но что делать с:
          for (var i = 0; i <  d.length; i++) {

          ?
          Ответить
          • var arraySize = d.length;
            while(arraySize--){
            some code
            }
            Ответить
            • А если порядок имеет значение?
              Ответить
            • while(arraySize-->0), все же корректней и красивей я считаю.
              По крайней мере для тех кто когда-либо в сиподобных наступал на silent overflow.
              Ответить
              • Люблю эту конструкцию за ее математичность: "arraySize стремится к нулю".
                Ответить
          • Ну например классическую сяшную оптимизацию:
            for (i=0, n=d.length; i<n; ++i) {
                // ...
            }
            Ответить
    • Тут как минимум вот это:
      [code language='javascript']
      if (b == 2) {
      var c = a.parentNode.parentNode
      }
      if (b == 3) {
      var c = a.parentNode.parentNode.parentNode
      }
      if (b == 4) {
      var c = a.parentNode.parentNode.parentNode.paren tNode
      }
      [/code]

      Можно было бы заменить на это:
      [code language='javascript']
      if(b>=2 && b<=4){
      var c = a
      for(var i=0;i<b;i++){
      c = c.parentNode
      }
      }
      [/code]
      Ответить

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