• Как работает 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 комментариев
  • Как защитить книги интернет магазинов?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Почти всегда DRM - это плохая идея.
    Покупайте юзеров отличным интерфейсом, множеством форматов, большим выбором книг и хорошей ценой.
    Вводите дополнительные сервисы вроде рецензий и обсуждений. Если люди полюбят ресурс то им будет проще купить у вас чем искать торренты. Берите пример с Bookmate, формат подписки гораздо привлекательней, чем покупка каждой книги по отдельности.
    Ответ написан
    Комментировать
  • Как перейти с PHP на C# (не по стандартным учебникам)?

    @Melz
    Почитать наверное все-таки придется.

    1. Ваш print_r($sum) по идее должен выбросить хотя бы варнинг тк вы создали $sum в цикле, а пользуетесь им вне цикла. В шарпах он там не будет существовать.

    2. В шарпах есть типы. Создавать числа как строки никто не будет. Смыла нет. Так же нет смысла преобразовывать число обратно в строку.

    Создать список с числами (не строками) от 100 до 999.
    var numberList = Enumerable.Range(100, 999).ToList();

    Не надо конвертировать число в строку (ваш метод так себе). Надо использовать остаток от деления на 10. Для 650 вернет 11.
    int sum = 0;
    for (int n = x; n > 0; sum += n % 10, n /= 10);

    На олимпиадах ненавидят Linq :D
    Весь ваш пример, включая генерацию списка. Сохраняет сумму в новый список.
    var numberList = Enumerable.Range(100, 999).ToList();
                var result = numberList.Select(x =>
                {
                    int sum = 0;
                    for (int n = x; n > 0; sum += n % 10, n /= 10);
                    return sum;
                });
                ;
    Ответ написан
    1 комментарий
  • Можно еще короче?

    angru
    @angru
    $.fizzBuzz(21);
    Ответ написан
    Комментировать
  • Объясните простыми словами как работает Redux?

    У вас есть одно большое дерево, в котором хранится все состояние (state) приложения - это хранилище (store).
    Также у вас есть набор редьюсеров (которые скомбинированы в один общий rootReducer) - это функции, который принимают текущее состояние и действие и возвращают новое состояние:
    function someReducer(state = initialState, action) {
      // обычно выглядит как switch 
      // action - простой js-объект
      //              и обязательно имеет строковое поле type
      switch(action.type) {
        // обрабатываем действие с типом SOME_ACTION_NAME
        case 'SOME_ACTION_NAME':
          // берем какие-то данные из экшена и возвращаем новое состояние
          // при этом менять sate нельзя!
          // state.someProperty = action.newStateData <--- НЕТ!
          return { ...state, action.newStateData };
        // Если мы не обрабатываем действие - просто возвращаем старое состояние
        default:
          return state;
      }
    }


    Также есть экшен креаторы (actionCreators) - это функции, которые возвращают действие. затем это действие вещается в хранилище (диспатчится). Типичный пример:
    function someActionCreator(someArg) {
      return {
        type: 'SOME_ACTION_NAME',
        newStateData: someArg + 5, // <-- разная логика
      };
    }


    По-умолчанию в качестве экшена мы можем вернуть только простой объект, но при создании хранилища можно добавить так называемый middleWare. Это специальные функции, которые принимают все экшены из диспатча и могут передавать их дальше (при этом содержат дополнительную логику).

    Если мы хотим получить доступ к состоянию в экшен креаторе - воспользуемся thunkMiddleware:
    import thunkMiddleware from 'redux-thunk';
    
    function createStore(initialState) {
      const reducer = combineReducers(reducers);
      const finalCreateStore = applyMiddleware(
        thunkMiddleware // <-- добавляем middleware
      )(defaultCreateStore);
      return finalCreateStore(reducer, initialState);
    }


    Теперь мы можем делать так:
    function someActionCreator(someArg) {
      return (dispatch, getState) => { // <-- возвращаем фукнцию, а не объект!
        const someState = getState().reducerName;
        return {
          type: 'SOME_ACTION_NAME',
          newStateData: someArg + someState, 
        };
      };
    }


    В общем схема выглядит так:

    actionCreator --action--> dispatch --action--> middleware --action--> store --action--> reducer --> newState


    Затем мы берем из react-redux метод connect, который подключает Ваш умный компонент к хранилищу:
    import { connect } from 'react-redux';
    import { bindActionCreators } from 'redux';
    
    class MyComponent extends Component {
      static propTypes = {
        someProp: PropTypes.string.isRequired,
        someFunc: PropTypes.func.isRequired,
      };
    }
    
    // Тут мы берем из глобального состояния необходимую нам часть
    // В ownProps - свойства компонента. Тут могут быть например свойства от роутера
    function mapStateToProps(state, ownProps) {
      return {
        someProp: state.someReducer,
      };
    }
    
    function mapActionsToProps(dispatch) {
      return bindActionCreators ({ // <-- биндим все на disptach для удобства
        someFunc: (someArg) => someActionCreator(someArg + 1),
      }, dispatch);
    }
    
    export default connect(
      mapStateToProps,
      mapActionsToProps
    )(MyComponent);
    Ответ написан
    3 комментария
  • Как изучаем Python?

    sim3x
    @sim3x
    Ответ написан
    Комментировать
  • Какой язык подходит для начинающих?

    antonsosnitzkij
    @antonsosnitzkij
    студент, житель санкт-петербурга
    С английского

    а еще просматривать предыдущие вопросы путем поиска
    Куда должен двигаться начинающий программист?
    Какой выбрать язык для изучения начинающему?
    Ответ написан
    Комментировать
  • Что выбрать ASP.NET MVC или SharePoint для Enterprise?

    @mureevms
    Разработка под SharePoint это гребаный ад.
    Сам вплотную сталкиваюсь не часто, но все коллеги разрабы плюются, при чем давно этим занимаясь и являясь в нем профи. Если Вы не разработчик, то не стоит с ним связываться. Совершенно не стоит.
    Ответ написан
    4 комментария
  • Обучение с нуля. С чего начать?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Начни с изучения английского языка. Самый полезный навык для будущего программиста. 90% лучших обучающих материалов, курсов и книг есть только на английском и русского перевода можно не дождаться. Кроме того, многие русские переводы иностранных обучающих материалов - ужасны.

    На втором месте определись с тем что именно ты хочешь программировать. Может это веб-приложения? Или мобильные приложения? Или программы для компов? Или может программы для дронов? Как только выберешь сосредоточься на поиске материалов именно по выбранной теме.

    Ну и не забывай что серьезное программирование неотделимо от матана. Изучай структуры данных, алгоритмы ну и вообще всё то что принято называть Computer Science.
    Ответ написан
    9 комментариев
  • Как убрать фриз программы c# WPF?

    dordzhiev
    @dordzhiev
    Вы запускаете все в отдельном потоке и "джоините" его к UI-потоку. Джоин блокирует текущий поток, до окончания работы другого потока, так что код у вас по сути синхронный. Используйте async\await.
    Ответ написан
    Комментировать
  • Стоит ли идти в 1С программисты?

    @FoxInSox
    1C - колхоз. Будете сидеть в потном офисе с 40-50 летними женщинами бухгалтерами за древним компьютером с CRT монитором. А если лет через пять 1С платформа помрет или заменится чем-то более современным, то ваши 5 лет пойдут коту под хвост.

    ps переезжайте в Питер или Москву.
    Ответ написан
    4 комментария
  • Поступление в ВУЗ, какое направление выбрать?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Туда где проще учиться и комфортнее общага.
    Ответ написан
    3 комментария
  • Как повторить текущую итерацию while C#?

    @smozhaykin
    Используйте, например, очередь. Добавьте в нее все файлы для обработки. В цикле пока очередь не пустая, берите первый элемент и делайте необходимые действия с этим файлом. Если все успешно - удаляйте элемент из очереди. Если ошибка - просто делайте continue (без удаления из очереди) и этот же файл будет обработан на следующей итерации цикла.
    Ответ написан
    Комментировать
  • Программирование. Какой ВУЗ выбрать?

    Able1991
    @Able1991
    Пишу на рельсах
    Выбирай вуз в котором сильные математики, программировать все равно сам будешь учиться, а всякие матаны и терверы натренируют твою соображалку на это.
    Ответ написан
    1 комментарий
  • С чего начать школьнику 16 лет?

    @pashwrs
    с англ языка стоит начать
    Ответ написан
    Комментировать
  • Насколько необходимо и нужно знание PHP/JS/Mobile Android в работе программиста 1С?

    @maxyc_webber
    Web-программист
    facepalm, sorry
    Ответ написан
    Комментировать
  • Как правильно составить регулярное выражение?

    @Nc_Soft
    Если нужно спарсить, то парсите как хмл.
    Ответ написан
    Комментировать
  • Как проверить строку на сбалансированность скобок?

    SHVV
    @SHVV
    Ололошки уже три ответа и ни одного правильного.
    function isBalanced(str) {
        // пары открывающих-закрывающих скобок
        var br = "(){}[]";
        // стек открытых скобок
        var st = [];
        // бежим по всей строке
        for (var i = 0; i < str.length; ++i) {
            // текущий символ
            var ch = str[i];
            // ищем символ в скобках
            var ind = br.indexOf(ch);
            // если скобка найдена
            if (ind >= 0) {
                // проверяем, какая это скобка
                if (ind & 1) {
                    // если закрывающая скобка, проверяем стек
                    // стек пуст - плохо
                    if (!st.length) return false;
                    // извлекаем последнюю открытую скобку из стека
                    var last_br = st.pop();
                    // если она не соответствует закрывающей скобке - тоже плохо
                    if (last_br != br[ind - 1]) return false;
                } else { 
                    // открывающую скобку просто пихаем в стек
                    st.push(ch);
                }
            }
        }
        // если после обхода всей строки стек пуст - всё ок
        return !st.length;
    }

    Проверять тут.
    Ответ написан
    2 комментария
  • Стоит ли изучать JavaScipt и C# одновременно с нуля?

    morozovdenis
    @morozovdenis
    Конечно нет. Эволюционно мозг человека сложился так что С++ и С# можно одновременно изучать, но JS и C# нет. Когда вы будете изучать JS вы будете тут же забывать C# полностью и наоборот. Вот C++ хороший, он сочетается с C#.
    Ответ написан
    1 комментарий