Хобрук: Ваш путь к мастерству в программировании

Предупреждение JSHint Функция, объявленная в цикле и ссылающаяся на переменную внешней области видимости, может привести к запутанной семантике. Как я могу улучшить код?

JSHint показывает ошибку: «Функция, объявленная в цикле, ссылающемся на переменную внешней области, может привести к запутанной семантике». Как я могу улучшить следующий код, чтобы избавиться от предупреждения?

var getPrecedence  = function getPrecedence(operator, operators) {
    var keys = Object.keys(Object(operators));
    for (var i = 0, len = keys.length; i < len; i++) {
        var check = Object.keys(operators[keys[i]]).some(function (item) {
            return item === operator;
    });
    if (check) return operators[keys[i]][operator];
    }
};

  • Мы могли бы помочь вам, если бы вы показали нам пример структуры operators. Не в последнюю очередь потому, что Object(operators) выглядит довольно странно, выглядит довольно странно... 25.01.2018
  • Это операторы. 25.01.2018
  • this.operators = {операторы: { ^: 1, *: 2, /: 2, %: 2, +: 3, -: 3, }, функции: { log: 0, sin: 0, cos: 0, tan : 0, }, скобки: {открыть: [(], закрыть: [)] }, равно: { =: 4 } }; 25.01.2018
  • Чтобы улучшить вопрос, используйте ссылку редактирования под вопросом, а не комментарии (особенно если вам нужно форматирование кода). 25.01.2018
  • @Kasia Возможно, вы захотите изменить свою структуру данных, чтобы она имела только один уровень, например {"^": {prec: 1, type: "op"}, "*": {prec: 2, type: "op"}, "log": {prec: 0, type:"fn"}, "(": {prec: 4, type:"open"} или около того. (Хотя ваша структура для скобок все равно не подходит) 25.01.2018

Ответы:


1

Предполагается, что вы не используете выражение функции внутри тела цикла, а вместо этого объявляете его снаружи:

function getPrecedence(operator, operators) {
    function isOperator(item) {
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        return item === operator;
    }
    var keys = Object.keys(Object(operators));
    for (var i = 0, len = keys.length; i < len; i++) {
        var check = Object.keys(operators[keys[i]]).some(isOperator);
//                                                       ^^^^^^^^^^
        if (check) return operators[keys[i]][operator];
    }
}

Конечно, все это можно упростить, просто используя includes вместо some и find вместо цикла:

function getPrecedence(operator, operators) {
    var keys = Object.keys(Object(operators));
    var opkey = keys.find(key =>
        Object.keys(operators[key]).includes(operator)
    );
    if (opkey) return operators[opkey][operator];
}

И, наконец, Object.keys(…).includes(…) можно упростить до operator in operators[key].

25.01.2018
  • И, наконец, Object.keys(…).includes(…) можно упростить до operator in operators[key] В этом случае, хотя, конечно, не в общем случае. 25.01.2018
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

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

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..