Cap*_*ano 9 javascript recursion jslint
我有一个带有递归函数调用的JavaScript代码段:
(function () {
    "use strict";
    var recurse = function (x) {
        if (x <= 0) {
            return;
        }
        return recurse(x - 1);
    };
    recurse(3);
}());
这只会召唤几次,但它会运行.
将上述内容粘贴到JSLint中会给出以下错误:
'recurse' is out of scope.
但是,如果我粘贴在以下代码段中,(使用函数声明而不是var):
(function () {
    "use strict";
    function recurse(x) {
        if (x <= 0) {
            return;
        }
        return recurse(x - 1);
    }
    recurse(3);
}());
JSLint喜欢它,没有错误.
我知道JSLint的目标是防止JavaScript代码中的错误.有谁知道为什么JSLint认为第一个是糟糕的JavaScript?通过不以第一种方式进行递归调用,我阻止了什么错误?
编辑:对此问题的任何未来访问者:这些JavaScript代码段都没有在最新版本的JSLint中引发任何错误.
两种风格都没有什么问题。据我所知,这是一个不恰当的警告。
问题似乎是,包含赋值的变量声明不会导致 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);
}());
通过绘制var recurse为单独的语句,JSLint 首先了解recurse当前作用域中声明的内容,然后解析赋值。通过您的组合var recurse = ...(这又没有错),JSLint 首先错误地解析了赋值,然后了解了recurse.