Ответы пользователя по тегу JavaScript
  • Код объясните,пожалуйста на JS(комментарии,если можно).Особенно интересует зачем здесь this?

    @amokrushin
    this в данном примере не нужен, можно заменить на что угодно null, 1, NaN, undefined...
    В остальном этот код рассматривает скорее костыли вокруг arguments нежели применение контекста вызова.
    Единственное что сейчас нужно знать про "arguments" - никогда его не использовать.
    В современном js этот код может выглядеть как-то так:
    function sum(...args) {
      return args.reduce((acc, val) => acc + val);
    }
    
    function mul(...args) {
      return args.reduce((acc, val) => acc * val);
    }
    
    function applyAll(func, ...values) {
      return func(...values);
    }
    
    alert( applyAll(sum, 1, 2, 3) ); // 6
    alert( applyAll(mul, 2, 3, 4) ); // 24
    alert( applyAll(Math.max, 2, -2, 3) ); // 3
    alert( applyAll(Math.min, 2, -2, 3) ); // -2
    Ответ написан
  • Не стандартный роутер на vue, как решить проблему плавного перехода?

    @amokrushin
    Есть костыльный способ заменить маршруты роутера:
    import Vue from 'vue'
    import Router from 'vue-router'
    
    Vue.use(Router)
    
    const createRouter = () => new Router({
      mode: 'history',
      routes: []
    })
    
    const router = createRouter()
    
    export function resetRouter () {
      const newRouter = createRouter()
      router.matcher = newRouter.matcher // the relevant part
    }
    
    export default router

    https://github.com/vuejs/vue-router/issues/1234#is...
    Ответ написан
    Комментировать
  • Как можно вставить html в виде строки в конкретное место функции с помощью Webpack?

    @amokrushin
    Например так (если добавить еще обработку ошибок, как минимум 404):
    const fs = require('fs');
    
    module.exports.index = function (req, res, next) {
        fs.createReadStream('./src/pages/index.html').on('error', next).pipe(res);
    });

    Но лучше использовать модуль express.static, еще лучше оставить статику веб-серверу nginx.

    Если же речь не об этом, а, например, о том как в скрипте используемом в процессе сборки с помощью webpack получить html в виде строки, то можно использовать webpack raw-loader
    import htmlString from 'raw-loader!./src/pages/index.html';
    Ответ написан
    Комментировать
  • Как f.toString здесь работает и расскажите, что происходит в этом коде?

    @amokrushin
    sum(0)(...)(n) всегда возвращает функцию f
    Метод alert принимает на вход строку, поэтому в момент вызова alert выполняется автоматическое преобразование функции f к строке. По умолчанию метод f.toString функции вернул бы текст ее исходного кода, но для функции f метод был преопределен и теперь он возвращает значение currentSum из замыкания.
    Казалось бы все хорошо, но это не так. В логических преобразованиях объект (в частном случае -
    это функция) всегда true. Поэтому, хоть
    console.log( Number(sum(5)(-5)) );
    и возвращает 0, результат
    console.log( Boolean(sum(5)(-5)) );
    будет true.
    Ответ написан
    Комментировать
  • Как пробить переменную из функции функции в компонент (Vue)?

    @amokrushin
    Вопрос не очень ясен, что значит "пробить"? В какой компонент?
    Если имеется ввиду установить значение data.city1 того же компонента из функции init которая расположена в хуке created этого компонента, то:
    ymaps.ready(init.bind(this));
    function init() {
        this.city1 = 'sdf';
    }

    либо
    ymaps.ready(() => {
        this.city1 = 'sdf';
    });

    вместо this.city1, можно использовать this.$data.city1
    Ответ написан
    Комментировать
  • Как раскодировать строку?

    @amokrushin
    decodeURIComponent(escape('Bj\u00c3\u00b6rn H\u00c3\u00bcttner'))

    Функция escape имеет статус deprecated
    stackoverflow.com/questions/13356493/decode-utf-8-...

    Или так
    /**
     * Decodes utf-8 encoded string back into multi-byte Unicode characters.
     *
     * Can be achieved JavaScript by decodeURIComponent(escape(str)),
     * but this approach may be useful in other languages.
     *
     * @param   {string} utf8String - UTF-8 string to be decoded back to Unicode.
     * @returns {string} Decoded Unicode string.
     */
    function utf8Decode(utf8String) {
        if (typeof utf8String != 'string') throw new TypeError('parameter ‘utf8String’ is not a string');
        // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
        const unicodeString = utf8String.replace(
            /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
            function(c) {  // (note parentheses for precedence)
                var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f);
                return String.fromCharCode(cc); }
        ).replace(
            /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
            function(c) {  // (note parentheses for precedence)
                var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
                return String.fromCharCode(cc); }
        );
        return unicodeString;
    }

    https://gist.github.com/chrisveness/bcb00eb717e638...
    Ответ написан
    1 комментарий
  • Как правильно наследоваться от объекта Error?

    @amokrushin
    В консоль вы выводите не err.toString(), a err.stack, значит вопрос в том откуда берется этот stack
    Смотрим
    1. throw new Error404("Ресурс не найден!");
    2. Error404 вызывается конструктор родителя - APIError super(message, 404, 2);
    3. APIError вызывается конструктор родителя - Error super(message);
    4. Конструктор Error. Здесь появляется this.stack - строка которая начинается с Error: Ресурс не найден!

    5. Возвращаемся к конструктору APIError после super(message); Меняется имя this.name = 'APIError'; После этого статический метод Error.captureStackTrace перезаписывает свойство this.stack на сей раз уже используя имя 'APIError', теперь this.stack начинается с APIError: Ресурс не найден!

    6. возвращаемся к конструктору Error404, меняем имя this.name = 'Error404';, но в строке this.stack так и остается APIError: Ресурс не найден!



    Исправить можно, например перенеся свойство name в прототип
    APIError.prototype.name = 'APIError';
    Error404.prototype.name = 'Error404';


    Либо удалить
    if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    } else {
        this.stack = (new Error()).stack;
    }

    Похоже на то, что для this.stackError устанавливает геттер затем используется ленивое вычисление, и если его не трогать раньше времени, то получится ожидаемое значение.
    Ответ написан
    Комментировать