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

    −3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    var api = angular.module('GithubApi', []);
    api.controller('GithubStatus', function ($scope, $http) {
        $http.get('/api.json')
            .success(function (response) { $scope.api = response; });
    });

    Пейсатели ж.скрипт фреймоврков не перестают радовать. Код несколько упрощен, но суть должна быть очевидна каждому: переменная api будет затерта как только она будет создана строкой типа "[object Object]" потому что в $scope есть поле с таким же значением.

    Запостил: wvxvw, 09 Ноября 2015

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

    • Видимо, не каждому
      я не работал с ангуляром и понятия не имею что такое переменная $scope
      по мне так api и $scope это две совершенно разные вещи, которые почти не пересекаются
      Ответить
      • Ну вот это я и люблю в ж.скрипт погромистах. Значение переменных определяется авторитетом. Знать, при этом что-либо не обязательно, можно даже бравировать отсутствием любых знаний.

        $scope - это так, по большому счету ангулар называет элемент ХТМЛя куда складываются разные данные посредством создания новых аттрибутов у этого элемента. К одному и тому же элементу можно прикрепить и скоп и контроллер (оба делают то же самое, но зачем-то в ангулар их два). Приложение на ангулар должно иметь как минимум один контроллер. Но вот незадача: переменные в области видимости скрипта контроллера ангулар похерит когда будет создавать аттрибуты скопа, если, случайно, имена совпадут, и оба будут прикреплены к одному и тому же элементу.
        Ответить
        • Пруф? Можно на jsfiddle или чем-нибудь подобном.
          Ответить
        • > Ну вот это я и люблю в ж.скрипт погромистах. Значение переменных определяется авторитетом.
          Звучит так, как будто в остальных языках такого нет.
          Какая разница, какой язык (ну, кроме сильно модульных/функциональных), если библиотека портит наши переменные, никто об этом не должен по умолчанию знать.
          Ответить
          • Ну как бы в нормальных языках библиотеки не видят локальных переменных вызывающей функции... И уж тем более не могут в них случайно насрать.
            Ответить
            • Выходит, во всех языках, кроме жс, можно срать в чужие локальные переменные, оттого тамошние программисты всегда тщательно читают маны, а жс-программисты без возможности править локальные переменные маны не читают и потому вызывают у wvxvw тёплые чувства?
              Ответить
          • ))что такое "модульный язык"?
            Язык, поддерживающий модульность и структурное программирование?
            Так это почти любой современный язык, ну кроме разве что PHP и JavaScript
            Ответить
            • В Си (а также в C++ и в Objective-C) тоже нет модульности на уровне языка.
              Ответить
              • Да ну?: в сях есть модуль трансляции. Можно делать символ приватным (ключ слово static). Вы видимо спутали неймспейсы с модулями.

                И уж конечно в сях функция не видит адресов в стеке вызвавшей её функции, если ей их явно не передали, и испортить чужие переменные не может
                Ответить
                • > и испортить чужие переменные не может
                  Да может в общем-то, если с указателями поиграть... Но это уже UB.
                  Ответить
                  • )ну если ты умеешь взять указатель на свой стек, знаешь архитектуру и умеешь поиграть с указателями то да. Ну так можно и компьютер молотком разбить
                    Ответить
            • и пхп и js умеют в модульность.
              Ответить
              • И как рнр в них умеет? Через классы?
                Ответить
                • И недонеймспейсы, в которые переменные нельзя положить.
                  Ответить
                  • ну да переменные должны принадлежать классу или всем. Не вижу проблем в этом
                    Ответить
                    • > Не вижу проблем в этом
                      Синдром утёнка?
                      Ответить
                      • Синдром утёнка?
                        не.
                        Я не вижу не обходимости делать глобальные переменные менее глобальными. Они же не "проваливаются" сами по себе внутрь методов.
                        Ответить
                        • давно-ли у вас там register_globals отключили?
                          Ответить
                          • Вчера. Я в сентябре в техподдержку написал, попросил PHP.IИI поправить. Сначала мой тикет закрыли, но я его переоткрывал каждый час, вот теперь мой сайт защищен! PHP ЛУДШЕ ВСЕХ!
                            Ответить
                          • лет 10 назад
                            Ответить
                        • Тупиковая ветвь эволюции, что поделать. Духовный наследник фортрана.
                          Ответить
                          • не нужно оскорблять прекрасного профессора аналогиями со взбесившимся шаблонизатором
                            Ответить
                    • Наверно то что по умолчанию потроха наружу?
                      Ответить
              • И умеют одинаково хуёво.
                Ответить
                • Это вы не умеете их готовить.
                  Ответить
                  • Ой Вась, да никто не умеет.

                    Нету ни стандартного описания модуля, ни стандарта на описание депенденсов, не говоря уже о едином репозитории.

                    Пеар был, да сдулся. Компосёр в альфе. У JS вообще их 100500 между собой не совместимых.
                    Ответить
                    • > Компосёр в альфе
                      ну нормальная такая себе альфа. работает и не жужу.
                      >У JS вообще
                      я только 2 знаю npm и Bower
                      Ответить
                      • > npm и Bower
                        В ангуляре ещё, емнип, что-то было.
                        Ответить
                        • >npm и Bower
                          это фигушки которые могут ставить с репозитария и обновлять при необходимости.
                          Ангуляр использовал requirejs
                          Ответить
                          • каждый дрочет как он хочет.

                            Вот на пистончике я могу написать библиотеку, опубликовать её в pypi, и другие люди смогут её использовать и на нее депендится.

                            А как мне написать библиотеку на js? через requirejs? через npm? bower?
                            Ответить
                  • И что в вашей экмапараше называется модулем?
                    Ответить
                    • само вызывающаяся функция
                      Ответить
                    • Функция, принимающая список зависимостей и возвращающая таблицу экспорта...
                      Ответить
                      • А, ну как и всё в экмапараше: В нашем недоязыке нету $featurename, поэтому давайте срать калбеками в кучу и делать вид, что у нас всё уже как бы есть
                        Ответить
                        • https://learn.javascript.ru/promise
                          я просто оставлю это
                          Ответить
                          • >>Промисификация — это когда берут асинхронный функционал и делают для него обёртку, возвращающую промис.
                            Ёбанаврот...
                            Ответить
                            • ВСЕОБЩАЯ ПРОМИСИФИКАЦИЯ НАСЕЛЕНИЯ

                              Проводится каждый год 31 декабря новогодним обращением президента РФ.
                              Ответить
                          • Что и требовалось доказать:
                            В нашей супергитлерасинхронной экмапараше нету примитивов синхронизации, поэтому давайте срать калбеками в кучу и делать вид, что они как бы и есть
                            Ответить
                            • Однако, а зачем синхронизация в однопоточном коде?
                              Ответить
            • Модульный? В достаточно модульном языке новая сущность скорее всего будет изолирована.
              Сильная модульность - когда нет глобальных переменных, модули зависят только от своих параметров и т.п. Сильномодульные языки предоставляют лёгкий способ реализовать сильную модульность и сложный/невозможный способ сломать её.

              Например, JS - среднемодульный, т.к. простым образом за счёт замыканий можно реализовать полностью изолированные модули. Но есть глобальные переменные и переменные внешних скопов, которые можно менять изнутри.
              Аналогично, брейнфак - слабомодульный.
              Ответить
              • Какая интересная классификация. Никогда с нею не сталкивался.
                Спасибо.
                Ответить
              • Перечисли сильномодульные языки по данной классификации.
                Ответить
                • Модула
                  Ответить
                • Честно говоря, если создавать один модуль/функцию, все языки - сильномодульные сильноогораживающие. Яркий пример - брейнфак. Одна программа - один модуль, полная изоляция от всех остальных модулей.
                  В PHP/python функции стремятся к сильной модульности огороженности.
                  В функциональных языках скорее всего сильная огороженность.
                  Ответить
                  • Ага. Т.е. если писать весь код в одной функции, то получится сильномодульная программа... Т.е. разрабы на PHP делали всё правильно, просто мы их не понимали...
                    Ответить
                    • >>Т.е. если писать весь код в одной функции
                      то функция выродится в приложение и все переменные станут глобальными:)

                      Слушайте, Дийкстра еще в 70х писал про стуктурное программирование
                      Ответить
                      • Тогда придётся написать 2 функции. Одну пустую. Во второй - весь код.
                        Ответить
                        • и тогда весь код будет максимально изолирован, следовательно это решение будет сильномодульным.

                          Итого: сильномодульным можно назвать такой, и только такой язык который позволяет написать 2 функции. Одну пустую. Во второй - весь код.
                          Ответить
                          • В таком случае Java и C# не модульные так как там нету функций, а только методы.

                            И кстати а паскале и бейсике можно писать процедуры, а не функции

                            лажа определение
                            Ответить
                            • А чем методы - не функции?
                              Главное в определении учесть брейнфак.
                              Ответить
                              • методы всегда принадлежат классу или его инстансу и используют 0 или более полей этого класса/инстанса
                                Ответить
                                • > используют 0 или более полей
                                  Ну нет, блять, минус одно.
                                  Ответить
                                • Но они от этого функциями не перестают быть. Ну, разве что вводят инфиксную запись:
                                  a + b как a .add (b) vs add(a,b)
                                  Ответить
                              • Статические/невиртуальные методы — это обычные функции, но принимающие в качестве неявного аргумента список полей объекта и его виртуальных методов (на случай, если в теле метода есть вызов виртуальных методов).

                                С динамическими/виртуальными всё хуже. При вызове такого метода нельзя быть уверенным в том, какая именно «функция» вызовется, потому что результат зависит от текущего состояния таблицы виртуальных методов объекта. Фактически виртуальный метод — это не функция, а переменная, указывающая на функцию.
                                Ответить
                                • В случае некоторых языков, например пистончика, они вполне себе явно принимают указатель на класс или объект.

                                  Кстати, в пистоне есть разница между статическими и класс-методами
                                  Ответить
                                • > переменная, указывающая на функцию
                                  О, вот хорошее отличие.
                                  Хотя, программист описывает именно эти функции. Про указатели же он (или вообще не он) говорит где-то в отдельном месте, порождая объекты: A a = new B;
                                  Ответить
                              • Видимо гость перепутал функции и свободные функции
                                Ответить
                            • Функции с типом результата void в сишке — чем не процедуры?
                              Ответить
                              • void foo() {
                                }
                                
                                void bar() {
                                    return foo(); // вот этим
                                }
                                Ответить
                                • И из-за какой-то сраки придумали герб, флаг и гимн?
                                  И из-за какого-то return придумали новый язык?
                                  Ответить
                                • ну да, войд это такой вот легальный тип

                                  можно его вернуть
                                  Ответить
                                  • Ну вот до ума не довели - нельзя положить этот void в переменную. И нельзя описать поле с типом void.
                                    Ответить
                                    • Зато можно описать указатель на void, который нельзя разыменовывать, как pointer в Паскале.
                                      Ответить
                                      • Зато можно скастить в указатель на что угодно
                                        Ответить
                                    • Потому что так было бы слишком просто.
                                      Ответить
                              • на самом деле процедуры, просто си сэкономило на понятии.
                                Ответить
                                • А в крестах немного до ума не довели... Надо было сделать тип void, имеющий размер 0 байт и одно значение void. Многие шаблонные вещи упростились бы...
                                  Ответить
                                  • в жабочке тоже есть Void. Если хочешь к примеру переопределить функцию которая вертает генерик, а вертать ничо не хочешь то можегшь вернуть Void
                                    Ответить
                                    • Это лжеVoid. Такой я и в крестах запилю.
                                      Ответить
                                      • Кстати в древних сях, чуть ли не во времена K&R нужно было указывать void как тип аргумента если функция ничего не получает. Например void foo(void), а имена аргументов указывать было нельзя:)
                                        Ответить
                                        • Это не древние си, а самые обычные.
                                          void foo(void) -- функция без аргументов,
                                          void bar() -- функция с любыми аргументами.
                                          Ответить
                    • Это досадное место, где математика троллит человека. Вроде того, что плюс бесконечность - минимум для пустого множества.
                      Ответить
                  • Ну и каша у тебя в голове.
                    Ответить
                    • Нужно писать стены текста с псевдонаучной, псевдофилософской херней, выдумывать на лету нечеткие термины, и доводить людей до бугурта.

                      Вот так бывает с теми, кто много пишет на JS.
                      Ответить
                      • Такое было ещё задолго до JS. Например термины, "объектно-ориентированный", "динамическая типизация", "байт" ничуть не лучше/полезней/чётче, чем "огороженность".
                        Ответить
                        • Вот нет.

                          >>объектно-ориентированный
                          Использующий концепцию объекта как сущности, содержащей данные и методы для работы с ними.

                          Хотя: даже в ЯП без ООП можно реализовать полуООП с opaque types, что и делают Win32API, Linux итд.

                          >>динамическая типизация
                          Знание о типе данных в момент исполнения программы.
                          Хотя: например в java в рантайме у генериков может потеряться информация о параметре: является-ли джава динамически типизированной?

                          >>байт
                          Ну тут все просто: байт это октет. Восемь бит.
                          В практически всех архитектурах, разработанных за последние 40 лет.

                          Хотя: термин конечно иплементейшен депендент, именно потому во всяких RFC предпочитают термин octet, а в нормальных изыках типа сей нету типа byte
                          Ответить
                          • Любой язык со статической типизацией может являться динамически типизированным, если юзать приводить все к object на примере жавы.
                            Ответить
                            • дай-ка я просвищу тебя на предмет терминов. Динамическая типизация это когда ты знаешь о типе в рантайме. Статическая это когда ты можешь узнать о типе выражения по коду, не запуская его.

                              От привода к обжекту ничего не изменится: тип выражения все равно можно будет посчитать
                              Ответить
                              • >просвищу
                                в хуй?

                                В питоне тоже во многих случаях можно узнать тип возвращаемого значения если он не зависит от внешних данных, и? В нем есть тот же object - PyObject
                                Ответить
                                • Кто о чем а пидор о хуях. Пидор тебя опять любовник бросил?
                                  Ответить
                                  • Русский знакомое слово услышал и прибежал.
                                    Ответить
                                  • А как еще можно просвистеть человека? Наверно в какое-то отверстие, я предположил первое что пришло в голову.
                                    Ответить
                                • >> >просвищу
                                  >> в хуй?
                                  >>
                                  Я под столом
                                  Ответить
                                  • А чего вы удивляетесь. Он же 3_14dar. Ему если не в голову то в жопу точно, что то придет.
                                    Ответить
                              • > От привода к обжекту ничего не изменится: тип выражения все равно можно будет посчитать
                                > тип выражения все равно можно будет посчитать
                                Только если исполнить программу.

                                Возьмём какой-нибудь язык со статической типизацией:
                                void* p; int type;
                                
                                switch(type = rand()) {
                                  case 0:
                                    p = malloc(sizeof(int));
                                    if(p) *(int*)p = 42;
                                    break;
                                  
                                  default:
                                    p = malloc(sizeof(float));
                                    if(p) *(float*)p = 42.0;
                                    break;
                                }

                                p - void*, type - int, годнота, статика, тип посчитан!
                                Ответить
                                • Да это, похоже, тот же гость
                                  http://govnokod.ru/18357#comment290314
                                  Ответить
                                • Тип указатель на воид. Ты тупой скриптовик, и не понимаешь что тип выражения считается статически, и не важно что на самом деле в памяти. Я могу вообще память перезаписать, язык не перестанет быть статически типизированным. Заебали уже тупые ламеры.
                                  Ответить
                                  • Сам такой!

                                    Я с таким же успехом могу сказать, что любой язык - статически типизированный т.к. хотя бы об одном типе "object" известно на этапе компиляции, а некоторые авторы компиляторов/интерпретаторов в целях оптимизации не считают тип выражения, т.к. он всё равно будет заранее известен и равен "object", из-за чего языки считают динамически типизированными и говорят, что на этапе компиляции типы не проверяются, но они-то на самом деле проверяются!

                                    Ну и что даёт нам знание о типе void*? Только то, что компилятор не смог на этапе компиляции вычислить реальный тип.
                                    Ах это я засунул туда int, я и виноват? Но компилятор засунул в слова и байты наши intы, floatы, char*ы и struct pitux, зачем тогда говорить о интах и питухах, когда все типы вычислены на этапе проектирования процессора?

                                    Итого, тип данных - понятие, зависимое от уровня абстракции. На одном уровне это слова и байты, на другом - указатели и целые, на третьем - пользовательские питухи. Языки со статической типизацией просто предоставляют нам возможность посчитать чуть больше типов на каком-то уровне абстракции. Если же мы поднимаемся выше этого уровня абстракции ("легальный" путь - динамический полиморфизм), мы получаем шиш и динамическую типизацию (может быть, рукотворную).
                                    Ответить
                      • Хайдеггер писал на JS?
                        Ответить
                    • Сам такой!
                      Ответить
              • Т.е., в итоге, си модульнее жс... А, может быть, даже сильномодульный...

                > лёгкий способ реализовать сильную модульность
                // внутри сишки
                static int x = 0;

                > сложный/невозможный способ сломать её
                Только через прямое ковыряние в памяти на грани UB'а. Адекватными способами обойти эту модульность нельзя.
                Ответить
                • > си модульнее жс
                  Хм, вот заняли слово "модульность" подключающимися кусками кода, а не разделяющимися кусками. Надо другое слово придумать. Инкапсулирующий? Изолирующий? Огораживающий? Разделяющий? Наверно, огораживающий.
                  Ответить
        • Атрибуты. По-русски это называется атрибуты.
          Ответить
          • Файервол по-русски будет брандмауэр.
            Ответить
            • >по-русски
              Ответить
            • А прайс-лист по-русски будет прейскурант.
              Ответить
              • А бэкспейс по-русски будет ЗАБОЙ.
                Ответить
                • Советские клавиатуры — самые ЗАБОЙНЫЕ клавиатуры в мире!
                  Ответить
                • Известный русист А.С.Шишков увлекался заменой заимствованных слов русскими вариантами.Вот,что у него получалось:аллея-просад;бильярд-шарокат;библиотека-книжница.Желание "не пускать в русский язык иностранные слова"было осмеяно современниками Шишкова в эпиграмме:

                  «Хорошилище грядет из ристалища на позорище по гульбищу в мокроступах и с растопыркой» («Франт идет из цирка в театр по бульвару в галошах и с зонтиком»)
                  Ответить
                • Недавно улучшил характеристики ПЗУ на НМЖД а своем ЭВМ.
                  Ответить
    • Хера вы срачельник развели
      Ответить
      • Во всём виноват ж.скрипт.
        Ответить
        • его просто не умеют готовить
          Ответить
          • О, а вот и любители делить на undefined подтянулись.
            Ответить
            • за джаваскриптом стоят только спецификация и движки. ковыряться в движках врятли кого-то заинтересует, то спецификации знать необходимо.
              знаешь спеки ecmascript, какие-то библиотеки js и тд уже не проблема.
              не знаешь - появляются такие посты негодования, если честно я даже сейчас не понимаю, что у автора поста не так с кодом, он даже объяснить нормально не смог.
              Ответить
          • Вы не любите фекалии? Вы просто не умеете их глтовить
            Ответить
    • Автор, что за бред? С хрена ли глобальная переменная api "будет затёрта" присвоением значения свойству api объекта $scope ($scope.api). Это ни разу не один и тот-же объект и не ссылка на него, равенство как Java == JavaScript - несколько буквы подряд похожих
      Ответить

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