• Как работает this?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ох...

    Для начала нам стоит прояснить что в javascript "методы" это обычные функции, которые просто привязаны к объекту. Если не вдаваться в подробности работы интерпритатора, вы можете спокойно вынести содержимое конструктора и заменить this на экземпляр объекта.

    Если совсем упростить - в javascript нет "методов", у объектов могут быть только свойства. "Методы" реализуются присваиванием функции (обычно анонимной) к свойству объекта.

    Теперь про this. this - это контекст вызова. Это "волшебная" переменная указывает на контекст, в котором мы вызвали какую-либо функцию. Она никак не фиксируется, и мы можем крутить и вертеть ей как хотим.

    По умолчанию она указывает на "владельца" функции. Тот объект, в контексте которого мы вызвали функцию.

    function foo() {console.log(this);}
    
    function MyObject() {
        this.foo = foo;
    }
    
    var hashMap = {
        foo: foo
    };
    
    var obj = {};
    var instance = new MyObject();
    obj.bar = instance.foo;  // мы можем даже красть методы
    
    foo(); // выведет window, если для браузера и мы вызывали в глобальном контексте
    instance.foo(); // выведет instance так как в контексте этого объекта мы это дело и вызывали
    hashMap.foo(); // выведет hashMap по той же причине
    obj.bar(); // выведет obj опять же потому что мы вызывали функцию в этом контексте
    foo.call('my own context') //мы можем задать свой контекст


    Зачем присваивается this и используется в дальнейшем?


    У функции есть своя область видимости. Ей доступны все переменные/идентификаторы которые определены в ее области видимости и выше в плодь до глобальной. То есть наши обработчики событий будут всегда видеть переменные объявленные в конструкторе. Причем именно то что было на момент вызова конструктора (то есть сохраняется во времени даже после завершения работы функции). Это к слову является типичной проблемой мемориликов, так как иногда люди забывают почистить за собой ссылки на объекты.

    У нас конечно есть еще функция bind, которая позволяет явно зафиксировать контекст, но иногда удобнее так.

    Именно за счет областей видимости функций в javascript мы достигаем инкапсуляции, скрываля приватные штуки внутри нашей области видимости и выплевывая наружу только то, что нужно. Самая настоящая инкапсуляция, модификаторы доступа в этом плане - просто кастыли (хотя для восприятия они проще).
    Ответ написан
    12 комментариев
  • Загрузка ЦП на 100%, в чем причина?

    saboteur_kiev
    @saboteur_kiev Куратор тега Железо
    software engineer
    html5 или flashplayer?
    хардварное ускорение включено?
    Видяшка может не умеет видео распаковывать, поэтому основной проц этим занимается?
    Ответ написан
    4 комментария
  • Вывод Alert по нажатию на кнопку?

    @westdp
    $(document).keydown(function (e) {
        if (e.keyCode == 112) {
           alert('blalba');
        }
    });
    Ответ написан
    6 комментариев
  • Почему батарея выдает постоянно 3.7В и на мгновение 0.3А а потом 0А?

    Stalker_RED
    @Stalker_RED
    При измерении силы тока амперметр включается последовательно с нагрузкой, в разрыв цепи. Если вы подключаете амперметр без нагрузки, то меряете какие-то переходные процессы внутри амперметра.

    %D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%
    © www.ruselectronic.com/news/multimjetr-i-izmjerjenija
    Ответ написан
    4 комментария
  • Как вы систематизируете полученные знания?

    @expmozgi
    Я столкнулся с тем, что информации настолько много, что она постоянно забывается. Поэтому было принято решение переводить знания на внешнее хранилище. Изначально решил проблему простым публичным блогом, но это оказалось неэффективно, сейчас использую следующие решения:

    1) Википедия на собственном приватном сервере. На главной странице группы, например, Programming, Health, Projects, Computer administration, Career и т.д. Далее в Programming есть варианты: PHP, PHP frameworks, Java и т.д.
    Когда узнаю что то новое записываю информацию. Потом, когда необходимо ее всмонить иду по данной структуре и нахожу то, что надо. Из википедии идут ссылки на примеры кода, которые расположены на bitbucket или файлы, которые расположены на dropbox или google drive.

    2) Для кода - приватные репозитории в bitbucket.
    3) Для файлов dropbox или google drive
    4) Для паролей - самописное решение на приватном сервере.
    5) Для заметок и списков keep.google.com

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

    Получается, что все завязано на википедии. По моему опыту - самый мощный, гибкий и понятный инструмент для организации хранения знаний.
    Ответ написан
    7 комментариев
  • Какие есть легкие CMS для просто блога?

    stasuss
    @stasuss
    быдлокодер со стажем
    жирдяй этот ваш вордпресс. есть такое понятие как flatfile cms. могу посоветовать www.gpeasy.com у самого крутится такая, нагрузка вообще минимальная.

    ну естественно если это действительно будет небольшой бложик. для крупных порталов конечно вордпресс подходит больше в виду заточенности под бд.
    Ответ написан
  • Как передавать данные между контроллерами в angularjs?

    dunmaksim
    @dunmaksim
    Технический писатель
    Создайте сервис, который будет хранить общие для всех контроллеров методы / данные, а потом используйте его. В качестве одного из параметров такой метод может принимать текущий $scope.
    Ответ написан
    Комментировать
  • Angular ng-options как установить selected?

    kompi
    @kompi
    nullstack devoops
    Если я правильно понял, то это нужно для первоначальной установки значений для select по определённому условию.
    Если это так, то это можно сделать в контроллере/директиве.
    Пример.
    Ответ написан
    Комментировать
  • Бесплатный SSL сертификат (StartSSL)?

    neuotq
    @neuotq
    Прокрастинация
    Кстати скоро обещают запустить https://letsencrypt.org/ , я вот их жду.
    Ответ написан
    3 комментария
  • Что такое Less и Sass?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Лень двигатель прогресса. Хороший пример - принцип DRY - Don't repeat yourself. Я весьма подозреваю что вы стараетесь соблюдать этот принцип когда делаете макеты или чем вы там занимаетесь. Так же я весьма уверен что вы хотя бы пытались чуть автоматизировать рутину своей повседневной работы. Так же у вас могли быть ситуации когда вы переиспользовали какие-то элементы. Мало ли.

    Так вот... CSS это тупая таблица стилей. Селектор и стили, ничего сверх умного тут придумать нельзя. Лет 5-10 назад было довольно модно держать один мегажирный CSS файл на 10К+ строк и радоваться жизни внося все больше изменений и т.д. Соответственно даже если вы соблюдаете всякие правила модульной верстки и все такое, у вас возникает несколько проблем:
    • организация стилей, то есть держать все в одном файле не удобно особенно когда проект длится годами
    • Дублирование стилей и селекторов. По мере развития проекта появляются какие-то снипиты которые можно реюзать. Так же у вас может появиться масса однообразных селекторов отличающихся лишь немного. При модульных подходах вложенности редко имеет место быть но все же имеет. Но не будем забывать что большинство фигачит селекторы просто так. В итоге если мы переместили блок или переименовали класс какого-то блока нужно отредактировать еще массу селекторов.
    • Привязка размеров и параметров к другим стилям, например у вас в стилях задана ширина блока, от нее зависят другие параметры, отступы для других блоков и т.д. Да, в css3 появился calc для этого но это было относительно недавно и только с недавних пор можно почти без опаски использовать эту штуку.
    • Таблицы стилей, как и HTML ориентированы на удобный разбор этого добра машиной, но не человеком. Человек же существо ленивое и как-то вот лень лишний раз скобку поставить или точку с запятой. Просто лень.


    Есть так же хорошее правило, или идея если хотите.... Если код можно сгенерить - его лучше сгенерить. То есть для решения всех выше перечисленных проблем придумали препроцессоры. Они как бы были и раньше всех этих scss/less/stylus но как-то не решали всех проблем и т.д. Что в итоге было предложено (перечисляю в том же порядке что и в списке выше).

    • У CSS есть такая штука как @ import. Но не очень круто импортировать сотню стилей в продакшене. Стоит сделать так что бы все стили были склеены при сборке проекта. Эта идея в итоге развилась и если разработчик использует это дело правильно, можно зайти в любой файл со стилями и увидеть список всего от чего зависят эти стили. Какие стили подключаются и т.д. Причем один файл с зависимостями может быть подключен в нескольких файлах а препроцессор сам разберется как и куда все вставлять сгенерив максимально оптимизированный по структуре файл. А разработчик получил четкую структуру файлов и возможность быстро найти где что и от чего зависит.
    • С селекторами проблему предложили решить наиболее логичным вариантом. Если у нас есть вложенные селекторы, то имеет смысл определять их внутри блока этого селектора. Это существенно упрощает поддержку стилей. Так же для управления снипитами и прочим добавили миксины - эдакие параметризованные или нет функции которые выплевывают шматок CSS. До появления штук вроде autoprefixer это был единственный способ писать поддерживаемые стили, использовать плюшки CSS3 и вообще новые плюшки и не сойти с ума от префиксов. Префиксы это только пример, там могут быть самые разные штуки позволяющие грамотно производить реюз стилей
    • Проблему зависимостей значений стилей друг от друга решили... собственно самым очевидным способом - переменные. Это удобно, легко поддерживать и в умелых руках это мощный инструмент. Нужно поменять базовые цвета - не нужно лазить по 100500 блоков и править значения руками, можно поправить переменные и все будет хорошо.
    • Насколько я помню SCSS/LESS не стремились решить эту проблему. Какие-то решения образовывались сами собой с течением времени. В плане минимализма и выразительности пожалуй сейчас самая крутая штука это stylus.


    Что в итоге произошло. В один прекрасный момент какие-то там рубисты придумали SCSS (они вообще не любят все что не в стиле ruby в плане минимализма и выразительности). Затем чуваки подумали и сказали, SCSS это круто но почему-то они используют синтаксис знакомый именно Ruby разработчикам а не обычные для CSS конструкции. В итоге реализовали LESS, причем его уже реализовали на javascript, что с наличием node.js позволило это все добро еще на одной платформе собирать. А так как под эту платформу и так плодили препроцессоры оно удачно вписалось.

    Далее уже шли какие-то модификации дальнейшие, вроде того же Stylus, где синтаксис упростили просто до нельзя.

    Личное мнение. На сегодняшний день я не вижу смысла использовать чистый CSS хоть на малых хоть на больших проектах. Вот вообще никакого.
    Ответ написан
    3 комментария
  • Изучение Java: мотивация, перспективы, краткий план?

    @Lici
    Извините, но посмотрите правде в глаза - вы ничего не умеете в этой жизни делать, кроме абстрактной, бесцельной и бесполезной учебы. Два высших образования и годы еще какого-то бесполезного чтения и просмотров чего-то якобы развивающего и полезного. Вы еще небось отличник. Лучше бы вы саус парк смотрели и брейкин бэд, но в остальное время действовали как мужчина - ставили себе задачу и методично ее решали. Не смотрели говнокурсы, а брали задание и кровь из носу выполняли его. А сейчас вам делать просто нечего, пишете тут многабукавы.

    Пока не измените вообще методологический подход к своей жизни - у вас все и будет так-же.
    Ответ написан
    12 комментариев
  • Гайд по именованию коммитов?

    @m-haritonov
    Как мне кажется, многое зависит от того, кто именно будет пользоваться комментариями (разработчики программы, пользователи и т.п.) и как именно, отчего и будет зависеть уровень абстрактности комментария и его содержание.

    Оптимальным, на мой взгляд, является написание комментария как краткого описания изменений с позиции собственного видения смысла вносимых изменений, руководствуясь при этом фактически произведёнными изменениями (т.е. не «улетать» слишком высоко в абстракции при описании изменений) и исходить из того, что комментарии предназначены для разработчиков. Если исправляется орфографическая ошибка, то в комментарии следует указать, что «исправлена орфографическая ошибка», если изменены несколько участков кода ради общей логики, то следует описать что именно за логика подразумевается (т.е. дать именно описание общей, абстрактной логики, а не перечислять изменённые методы, классы и т.п.).

    В случае Вашего примера, думаю, следовало написать что-то вроде «Убран лишний вызов функции getCharset в CurlResult::fetch» (чтобы были ясны Ваши намерения; Вы же убрали вызов так как он лишний (о чём потом даже написали в своём посте — «просто лишний раз дергал метод»), а не ради исправления какой-то ошибки).

    Что касается использования в комментарии названий сущностей из программного кода (имён методов, классов, пространств имён и т.п.), которые были изменены, то, на мой взгляд, следует пытаться находить баланс между желанием конкретизировать область изменений и размером комментария (т.е. я за присутствие в комментарии указания на область изменений, просто конкретизация будет варьироваться от названия конкретных сущностей из программного кода до обобщённых названий). Так, например, вместо комментария «добавлена поддержка рекурсивного удаления файлов» я бы предпочёл комментарий «добавлена поддержка рекурсивного удаления файлов в функции removeDirectory»), а вместо комментария «добавлена поддержка событий в классах Plugin1, Plugin2, Plugin3» предпочёл бы «добавлена поддержка событий в плагинах».

    Ещё можно попробовать настроить программу просмотра таким образом, чтобы она в начале комментария выводила общий для всех изменённых файлов путь (поможет, если в программе соблюдается соответствие между именем файла и программной сущности, содержащейся в нём).
    Ответ написан
    Комментировать
  • Что читать вместо CLR via C# (на русском языке)?

    Думаю, вам пригодится статья Классические книги по C#/.NET, в ней приводится наиболее полезные книжки с краткими отзывами.
    Ответ написан
    Комментировать
  • Как отстоять права на собственный сайт?

    @Anatole
    Вариант — подать в суд на нового владельца. Максимум, что ему будет — заставят убрать ваш контент и оплатить судебные издержки. Домен назад получить (в вашем случае) невозможно.

    Другой вариант — купите сайт у нового владельца и впредь будьте осмотрительны.

    Третий вариант (он мне нравится бьольше всех) — плюньте на всё, сделайте «с нуля» и в 100 раз лучше.
    Ответ написан
    Комментировать
  • Непонятное поведение Apache. Virtual hosts?

    @jamayka
    Попробуй добавить какой-нибудь ServerName для дефолтного виртуального хоста. Из документации:
    If no ServerName is specified, then the server attempts to deduce the hostname by performing a reverse lookup on the IP address.
    Ответ написан
    3 комментария
  • Синтаксис ООП в js и использование prototype

    runawayed
    @runawayed
    JS — объектно-ориентированный язык, но в нем отсутствуют классы, их заменяют конструкторы объектов, поэтому вместо обычного наследования через классы существует наследование через прототипы. Т.е. экземпляр класса наследует его свойства и методы, которые находятся в его прототипе.
    Конструктор класса (function Obj() {}) — функция, в которой описаны свойства и методы прототипа, поэтому ко всем ним будет доступ при создании экземпляра.

    В примере A конструктор пустой, а Obj.method присваивает метод объекту, а не его прототипу, поэтому он не будет наследован в obj = new Obj(). Этот пример не работает.

    Пример B — правильный, здесь метод method добавляется в прототип и будет наследоваться всеми экземплярами.

    Пример C чаще всего используется, когда нужно реализовать singleton или namespace, потому что это простой хэш без конструктора, его нельзя наследовать. Фактически это не объект в ООП понимании, а просто ассоциативный массив, в котором могут содержаться любые данные, методы и другие объекты.

    Пример D аналогичен примеру C, только его свойство method содержит ссылку на внешнюю функцию. Этот пример можно использовать, когда нужно вызвать какую-то функцию из внешней библиотеки.

    Пример E правильный и аналогичен примеру B, с разницей в том, что наследуемый метод задается сразу в конструкторе, а не через prototype.
    Ответ написан
    1 комментарий