JSLint声称某些递归函数调用"超出范围"

Cap*_*ano 9 javascript recursion jslint

我有一个带有递归函数调用的JavaScript代码段:

(function () {
    "use strict";

    var recurse = function (x) {
        if (x <= 0) {
            return;
        }
        return recurse(x - 1);
    };

    recurse(3);
}());
Run Code Online (Sandbox Code Playgroud)

这只会召唤几次,但它会运行.

将上述内容粘贴到JSLint中会给出以下错误:

'recurse' is out of scope.
Run Code Online (Sandbox Code Playgroud)

但是,如果我粘贴在以下代码段中,(使用函数声明而不是var):

(function () {
    "use strict";

    function recurse(x) {
        if (x <= 0) {
            return;
        }
        return recurse(x - 1);
    }

    recurse(3);
}());
Run Code Online (Sandbox Code Playgroud)

JSLint喜欢它,没有错误.

我知道JSLint的目标是防止JavaScript代码中的错误.有谁知道为什么JSLint认为第一个是糟糕的JavaScript?通过不以第一种方式进行递归调用,我阻止了什么错误?

编辑:对此问题的任何未来访问者:这些JavaScript代码段都没有在最新版本的JSLint中引发任何错误.

aps*_*ers 4

两种风格都没有什么问题。据我所知,这是一个不恰当的警告。

问题似乎是,包含赋值的变量声明不会导致 JSLint 在作用域中注册声明的变量名称的存在,直到评估整个赋值为止。也就是说,当 JSLint 读取 时,直到它计算赋值的右侧之后,var recurse = ...它才意识到这是一个已声明的变量。recurse在本例中,右侧包含一个使用声明的变量 的函数recurse,但 JSLint 不知道 的存在recurse,因为它还没有完成对整个赋值的解析。

请考虑此代码的工作方式与您的示例完全相同,但在 JSLint 中不会产生警告:var

(function () {
    "use strict";

    var recurse;
    recurse = function (x) {
        if (x <= 0) {
            return;
        }
        return recurse(x - 1);
    };

    recurse(3);
}());
Run Code Online (Sandbox Code Playgroud)

通过绘制var recurse为单独的语句,JSLint 首先了解recurse当前作用域中声明的内容,然后解析赋值。通过您的组合var recurse = ...(这又没有错),JSLint 首先错误地解析了赋值,然后了解了recurse.