【问题标题】:Mutual recursion and JSLint - function was used before it was defined相互递归和 JSLint - 函数在定义之前使用
【发布时间】:2017-08-22 02:34:24
【问题描述】:

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

【问题讨论】:

  • function isOdd(n) ...etc..
  • @JaromandaX JSLint 即使我使用这种格式仍然会抱怨
  • 我猜这与no-use-before-define选项有关
  • var isOdd;var isEven = ... 之前然后从您的var isOdd 中删除var
  • 您应该从您的计算机中删除 JSLint,将其刺入心脏,将其分成小块,将其烧掉,然后将其掩埋。它从来都不是一个好的工具,现在已经过时了。

标签: javascript node.js recursion jslint mutual-recursion


【解决方案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);
};

【讨论】:

    【解决方案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);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 2014-06-07
      • 2010-10-22
      • 2012-03-26
      • 2013-08-17
      • 2017-07-18
      • 1970-01-01
      相关资源
      最近更新 更多