gpt4 book ai didi

javascript - JSLint 声称某些递归函数调用是 "out of scope"

转载 作者:数据小太阳 更新时间:2023-10-29 03:54:58 25 4
gpt4 key购买 nike

我有一个带有递归函数调用的 JavaScript snippet:

(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?我通过不以第一种方式进行递归调用来防止什么错误?

编辑:对于此问题的任何 future 访问者:这些 JavaScript 片段都不会在最新版本的 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 recurse 提取为单独的语句,JSLint 首先了解到 recurse 是在当前范围内声明的,然后然后解析任务。使用您的组合 var recurse = ...(同样,这没有错),JSLint 错误地首先解析赋值,然后了解 recurse 的存在。

关于javascript - JSLint 声称某些递归函数调用是 "out of scope",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33787474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com