相互递归和 JSLint - 函数在定义之前被使用

Mutual recursion and JSLint - function was used before it was defined

如果我编写以下代码,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);
};

对于 JSLint,您必须在文件顶部添加一个全局变量指令,以便它忽略临时 "undefined" 函数和变量的使用。

/*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);
};

将这些函数转换为对象的方法可以消除来自 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);
    }
};