Взаимная рекурсия и 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);
};