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);
}());