• Как это сделать? Для каждого select option своя стоимость и время в пути?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ну вот начало, может, разберетесь:


    Остается добавить кол-во билетов и вывод выбранного варианта.
    Ответ написан
    Комментировать
  • Каррирование... Что здесь происходит?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Константин, карирование оно не в вызове функции. А в том, что после вызова функции возвращается другая функция, внутри которой есть замыкание на аргумент, переданный в предыдущий вызов.

    Правильно ли я понимаю, что curriedSum(1)(2,3) - здесь в качества a - цифра 1, а в качестве b - (2,3) ? А как же c?

    Eсли смотреть относительно функции sum, то:
    В первых круглых скобка только a = 1.
    Во вторых круглых скобках b = 2 и c = 3.

    А здесь тогда как? curriedSum(1)(2)(3) - где здесь каррирование?

    Первый вызов вернёт функцию, которая "помнит" 1, второй вызов вернёт функцию, которая "помнит" 1+2, ну и третий вызов вернёт сумму 1+2+3.

    То есть эта запись: curriedSum(1)(2)(3)
    Эквивалентна этой:
    let curriedSum = curry(sum); // сделали функцию sum карируемой.
    
    var one = curriedSum(1) // так как sum ожидает 3 аргумента, то этот вызов вернёт функццию, которая помнит 1 и ожидает ещё 2 аргумента.
    var onePlusTwo = one(2) // так как sum ожидает 3 аргумента, то этот вызов вернёт функццию, которая помнит 1 и 2 и ожидает ещё 1 аргумент.
    var result = onePlusTwo(3) // так как sum ожидает 3 аргумента, два аргумента уже помнит функция onePlusTwo и мы передаём третий аргумент, то вернёт результат sum(1,2,3)
    result == 6 // true
    
    // При этом, мы можем в данном случае снова вызвать onePlusTwo, но уже с другим аргументом,
    // и получим соответствующий результат:
    onePlusTwo(7) // вернёт 10, так как onePlusTwo помнит 1+2, то есть получим sum(1,2,7) // 10.

    Вот в чём и состоит смысл карирования. Иметь функцию, которая помнит какое-то значение и не требует каждый раз это значение в аргументах.
    Ответ написан
    Комментировать
  • Как это работает?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это просто демонстрация того, как выполнять длинные циклические вычисления без подвешивания браузера.
    Функция делает миллион проходов цикла, затем проверяет, достиг ли счётчик миллиарда. Если достиг, то выводит сообщение и завершается. Если нет, то функция ставит себя в очередь макрозадач вызовом setTimeout с нулевым временем. Перед повторным вызовом функции из очереди будут выполнены все накопившиеся за время работы цикла макро- и микрозадачи (события, промисы, другие сработавшие таймауты и интервалы).
    Ответ написан
    5 комментариев
  • Объясните, чем здесь является elem.onclick?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    В конструктор передаётся html элемент.
    Ему в onClick назначается одноимённый метод класса Menu.
    то есть в onClick элемента кладётся вот это:
    onClick(event) {
          let action = event.target.dataset.action;
          if (action) {
            this[action]();
          }
        }

    с забинженным контекстом на инстанс класса. Так как по умолчанию в обработчиках событий this равен элементу.
    А вот зачем там в _elemкладётся elem это загадка.
    Ответ написан
    Комментировать
  • DOM. Конструктор класса?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Некий сумбур вопроса без примеров кода попробую разобрать, отталкиваясь от знаков вопроса.

    У всех (ну, почти) объектов в JavaScript в корне цепочки наследования — глобальный Object. У прототипа которого есть свойство constructor. Это ссылка на функцию, создавшую сей инстанс.

    У функций в JavaScript есть свойство name.

    Не важно, как именно создан объект. Если он — объект, у него, скорее всего, есть конструктор:
    const el = document.createElement('div');
    el.constructor.name // "HTMLDivElement"


    А вот с классом
    class Habr {
      constructor(q) {
        this.q = q;
      }
    }
    
    const h = new Habr('есть конструктор?');
    h.constructor.name  // "Habr"
    Ответ написан
    Комментировать
  • Расширение встроенных классов - ничего не пойму?

    hahenty
    @hahenty
    ('•')
    На данном этапе познания в такие вещи надо просто верить. Понимание приходит позже, когда требуется окунуться в потроха языка программирования. Да и в целом, чтение справочников — это навык, который развивается вместе с теоретическими и практическими знаниями.
    Например

    Поэтому при вызове метода arr.filter() он внутри создаёт массив результатов, именно используя arr.constructor, а не обычный массив. Это замечательно, поскольку можно продолжать использовать методы PowerArray далее на результатах.

    Лично я о таком не знал, что расширения класса будут отражаться на результирующих массивах. Я бы подумал, что придётся вручную переопределять нативные методы, чтобы они применяли классовое расширение на результатах. Но создатели js решили учесть это, когда ввели class-extend в язык. И, как мне теперь кажется, метод constructor как раз занимается расширяющей рутиной, предварительно будучи самим переопределённым где-то внутри конструкции class-extend. И другие нативные методы теперь опираются на собственный метод объекта расширенного класса, а не исходного.
    Ответ написан
    1 комментарий
  • Почему не удаляется свойство?

    black1277
    @black1277
    Вольный стрелок
    Потому что в первом случае ты обращаешься к экземпляру класса, а во втором случае к прототипу самого класса. Неужели сам не видишь?
    Ответ написан
    5 комментариев
  • Почему название свойства value нельзя заменить на просто v или что-либо еще?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Потому что defineProperty ожидает в третьем аргументе объект с ключом value. Что тут ещё можно добавить? Можно с тем же успехом спросить почему код не работает, если его написать на бумажке.
    Ответ написан
    Комментировать
  • Где здесь замыкание? О чем вообще речь?

    Vindicar
    @Vindicar
    RTFM!
    В коде создаётся анонимная функция, которая передаётся как параметр в setTimeout().
    Тело этой функции имеет доступ не только к своим параметрам (в данном случае их нет) и к своим локальным переменным, но и к локальным переменным той области видимости, где эта функция объявлена. В нашем случае это user.
    Ответ написан
    Комментировать
  • Как он узнает, что (3, 5) - это arguments?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    arguments - это массив массиво-подобный объект аргументов, всегда присутствующий в функции (кроме стрелочных).
    Тут используется декоратор – функция-обёртка над другой функцией.
    Изначальная функция worker.slow()оборачивается в новую функцию-декоратор. Декоратор выполняет некую работу, вызывает оригинальную функцию, с ее результатом может выполнить еще какую-то работу, и возвращает итоговый результат.

    После выполнения этой строчки
    worker.slow = cachingDecorator(worker.slow, hash);
    в worker.slow у вас уже не оригинал, а декоратор. Т.е. эта функция
    function() {
        let key = hash(arguments); // (*)
        if (cache.has(key)) {
          return cache.get(key);
        }
    
        let result = func.call(this, ...arguments); // (**)
    
        cache.set(key, result);
        return result;
      };


    Именно она выполняется в последней строчке. Сюда передаются аргументы 3 и 5, которые и попадают в зарезервированный массив arguments.

    Можно переписать так, чтобы лучше понять, что происходит:

    function cachingDecorator(func, hash) {
      let cache = new Map();
      return function(arg1, arg2) { // явно указать аргументы
        let key = hash(arg1, arg2); // (*)
        if (cache.has(key)) {
          return cache.get(key);
        }
    
        let result = func.call(this, arg1, arg2); // (**)
    
        cache.set(key, result);
        return result;
      };
    }
    Ответ написан
  • Почему в качестве this здесь worker?

    Kentavr16
    @Kentavr16
    long cold winter
    Почему бы не загуглить calljavascript?
    Ответ написан
    3 комментария
  • Почему в качестве this здесь worker?

    kaverza
    @kaverza
    Потому-что cachingDecorator возвращает функцию, ссылка на которую присвоена методу slow объекта worker.

    вот альтернативные варианты записи

    worker { 
        slow: function(x) {
            // this = worker
        }
    }

    worker.slow = function(x) {
      // this = worker
    }


    function test() {
       // this = window;
    }
    worker.slow = test; // передали по ссылке, теперь this = worker


    const resFunc = cachingDecorator(worker.slow); // вернул функцию function(x), this = window
    worker.slow = resFunc; // передали по ссылке, this = worker


    советую почитать про замыкания, там более подробно все это описано.
    Ответ написан
    1 комментарий
  • На этой строчке происходит вызов функции или что-то другое?

    @top_666_666
    вызов функции function cachingDecorator(func) + результат из функции равно slow
    Ответ написан
    2 комментария
  • Чему равен параметр x в функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    трюк в том, что функция inArray() возвращает ... ещё одну функцию, которую только что создала при вызове:
    function inArray(arr) {
      const result = function(x) {
        // внутри этой функции будет ещё и доступен
        // arr, с которым вызвали inArray()
        return arr.includes(x);
      };
    
      return result;
    }
    Т.е. вызов inArray() с каким-то массивом возвращает всего лишь ещё одну функцию, которая принимает любой аргумент, но ещё и «запомнила» конкретный arr, с которым её создали.

    В вашем примере создаётся функция с массивом: const myFilter = inArray([1, 2, 10]);это свежесозданная функция, которая для любого аргумента возвращает true/false — есть ли это же значение в массиве [1, 2, 10]
    Ответ написан
    9 комментариев
  • Что здесь происходит, вообще ничего не понимаю?

    Anopeng
    @Anopeng
    Веб-программист, учу фронт и бек
    Нужно было внимательно читать. Мы берем встроенную функцию-итератор из строки. Создаем бесконечный цикл, в нем вызываем метод итератора next, который совершает шаг итератора, - нам вернули объект. Если свойство done этого объекта == true, то мы прекращаем цикл (это происходит, когда мы прошлись по всей строке). Иначе выводим результат текущей итерации - value
    Ответ написан
    8 комментариев
  • Сортировка элементов. Что здесь 'a', а что 'b'?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Какой элемент функция sort передаст в callback-функцию первым, тот и a. Который вторым - тот b.
    А какие именно элементы - это сама функция sort решает.
    Callback-функция просто должна установить отношение следования между элементами. Если значение первого аргумента должно идти до значения второго, то вернуть число, большее нуля. Если после, то вернуть число, меньшее нуля. Если значения элементов равны, то вернуть ноль.
    Ответ написан
    1 комментарий
  • Сортировка элементов. Что здесь 'a', а что 'b'?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    В вашем случае так:
    Шаг 1. a=1, b=2
    Шаг 2. a=2, b=15
    Документация.
    Ответ написан
    4 комментария
  • Как это работает? Что здесь происходит?

    Dr_Elvis
    @Dr_Elvis
    В гугле забанен
    Ищет в users весь item, где item.id=1 и записывает в переменную user {id: 1, name: "Вася"}, а далее выводит в alert "Вася"
    Ответ написан
    1 комментарий