Взаимная рекурсия и JSLint - функция использовалась до того, как была определена

Если я пишу следующий код, JSLint жалуется, что isOdd использовался до того, как он был определен. Есть ли способ написать взаимно рекурсивный код и все же, пожалуйста, JSLint?

var isEven = function(n) {
    if (n === 0) {
        return true;
    }
    return isOdd(n - 1);
};

var isOdd = function(n) {
    if (n === 0) {
        return false;
    }
    return isEven(n - 1);
};

2 ответа

Решение

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

var numUtil = {
    isEven: function(n) {
        if (n === 0) {
            return true;
        }
        return this.isOdd(n - 1);
    },
    isOdd: function(n) {
        if (n === 0) {
            return false;
        }
        return this.isEven(n - 1);
    }
};

Для JSLint вы должны добавить директиву глобальных переменных в начало файла, чтобы она игнорировала использование временных "неопределенных" функций и переменных.

/*global isOdd */

var isEven = function(n) {
    if (n === 0) {
        return true;
    }
    return isOdd(n - 1);
};

var isOdd = function(n) {
    if (n === 0) {
        return false;
    }
    return isEven(n - 1);
};

Вы также можете объявить isOdd вверху, но тогда вы бы изменили свой фактический код, потому что программа linting не понимает подъем:

var isOdd;

var isEven = function(n) {
    if (n === 0) {
        return true;
    }
    return isOdd(n - 1);
};

isOdd = function(n) {
    if (n === 0) {
        return false;
    }
    return isEven(n - 1);
};

Другие вопросы по тегам