6

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

2 回答 2

4

对于 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);
};

于 2017-08-22T02:54:32.727 回答
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);
    }
};
于 2017-08-23T20:38:30.970 回答