Ho un Javascript snippet con una chiamata di funzione ricorsiva:JSLint sostiene alcune chiamate di funzione ricorsiva sono "fuori portata"
(function() {
"use strict";
var recurse = function (x) {
if (x <= 0) {
return;
}
return recurse(x - 1);
};
recurse(3);
}());
Questo non fa altro che chiamare se stesso un paio di volte, ma funziona.
incollando il sopra in JSLint mi dà questo errore:
'recurse' is out of scope.
Tuttavia, se mi incollo nel seguente frammento, (usando una dichiarazione di funzione, invece di var):
(function() {
"use strict";
function recurse(x) {
if (x <= 0) {
return;
}
return recurse(x - 1);
}
recurse(3);
}());
JSLint ama esso, nessun errore.
So che l'obiettivo di JSLint è di prevenire i bug nel codice Javascript. Qualcuno sa perché JSLint pensa che il primo sia un Javascript errato? Quale errore sto impedendo non facendo una chiamata ricorsiva nel primo modo?
JSLint è un trascinamento. Il primo non è male JavaScript. [JSHint] (http://jshint.com) non ha problemi con esso. Né [ESLint] (http://eslint.org). –
Penso che quello che JSLint sta * cercando * di dirti è che al momento in cui definisci la tua espressione di funzione, la variabile 'recurse' ha il valore' undefined'. Questo non è un problema, ovviamente, perché nel momento in cui effettivamente * chiami * la tua funzione, 'recurse' * è * definita. – apsillers
No, gratta questo - se fai semplicemente 'var recurse;' e poi 'recurse = function ... 'questo fa sparire l'avvertimento senza cambiare la situazione che ho descritto sopra. Il vero problema è che JSLint non registra 'recurse' come in-scope finché non viene valutata l'espressione' var recurse = ... '(ma il lato sinistro dovrebbe essere sufficiente per farlo) . – apsillers