我有一个 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吗?通过不使用第一种递归调用方式,我可以预防哪些错误呢?
编辑:对于这个问题的任何未来访问者:在最新版本的JSLint中,这两个JavaScript片段都不会抛出任何错误。
var recurse;
然后recurse = function...
,那么这将使警告消失,而不会改变我上面描述的情况。真正的问题是,直到整个var recurse = ...
表达式被评估之前,JSLint 并不会将recurse
注册为在范围内(但左侧应该足以让它知道)。 - apsillers