Javascript JSLint声称某些递归函数调用是;“超出范围”;

Javascript JSLint声称某些递归函数调用是;“超出范围”;,javascript,recursion,jslint,Javascript,Recursion,Jslint,我有一个递归函数调用: (function () { "use strict"; var recurse = function (x) { if (x <= 0) { return; } return recurse(x - 1); }; recurse(3); }()); 但是,如果我粘贴以下代码段(使用函数声明而不是var): (函数(){ “严格使用”; 函数递归(x){ 如

我有一个递归函数调用:

(function () {
    "use strict";

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

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

(函数(){
“严格使用”;
函数递归(x){

如果(x在定义函数时,变量recurse还没有定义,这就是为什么JSLint说它超出了范围,声称它可能没有定义,这一点。

这两种样式都没有问题。据我所知,这是一个不适当的警告

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

假设此代码的工作原理与您的
var
示例完全相同,但在JSLint中不会产生警告:

(function () {
    "use strict";

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

    recurse(3);
}());
(函数(){
“严格使用”;
var递归;
递归=函数(x){

如果(x JSLint是一个拖拉。第一个JavaScript不错。它没有问题。也没有。我想JSLint想告诉你的是,在定义函数表达式时,变量
recurse
的值
undefined
。当然,这不是问题,因为在实际调用函数时,
recurse
是定义的。不,如果你简单地执行
var recurse;
然后执行
recurse=function…
,那么警告就会消失,而不会改变我上面描述的情况。真正的问题是,JSLint在整个
var recurse=。。.
表达式被计算(但左侧应该足以让它知道).@apsillers sigh-JSLint造成了如此多的痛苦,在这种情况下,它甚至没有得到正确的投诉!标签上应该有一个警告。@Idk眯着眼睛,JSLint做得很好。更不用说争论团队应该设置什么设置了,等等,&,撇开bug不谈,Crockford的规则在客观上从来没有错过。看,Crockford,还有这个ES6就绪版本还没有旧版本测试得那么好。(依我看,它仍然是测试版。)将此标记为已接受的答案,直到有人告诉我第一个示例可能会出现什么问题。谢谢!我打赌这是因为
recurse
recurse
定义中使用了
recurse
,而edge案例尚未被捕获。它在中起作用,值得一提的是,Crockford不久前从beta版中推出了新的一个,但它是蒂尔有很多漏洞。你可以向他报告。我认为这是一个合法的漏洞。
(function () {
    "use strict";

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

    recurse(3);
}());
(function () {
    "use strict";

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

    recurse(3);
}());