Tutto l'errore significa in JSHint/JSLint è che non ha dichiarato la propria chiave/iteratore variabile. Come @Christopher suggests, JSLint vuole di dichiarare che nella parte superiore del suo campo di applicazione (google JavaScript hoisting
per maggiori informazioni sul sollevamento, like this link):
/*global data, identifier, DIVsuggestions */
// We'll pretend all of the above were passed in from a function's parameters
// by using JSLint's "global" keyword -- now you can paste this code into
// jslint.com and have it pass muster.
// make array
var sugested_sports = data.split(","),
sporty_items = '', // pre build DIV
sport; // <<<< **** DECLARE YOUR "KEY" HERE ****
for (sport in sugested_sports)
{
if (sugested_sports.hasOwnProperty(sport)) {
sporty_items += '<a href="#'+identifier[1]+'">'
+sugested_sports[sport]+'</a>';
}
}
// insert DIV
DIVsuggestions.html(sporty_items);
Questo errore bad for in variable
qui si riduce alla stessa di un errore di 'sport' was used before it was defined
altrove.
EDIT: Vale la pena ricordare che, se il vostro for
è in una funzione interna, è necessario dichiarare la variabile for in
in quello stesso contesto. JSLint si lamenterà se dichiari lo for in
nel contesto genitore.
Esempio:
function spam(d)
{
var fnTest, row; // `row` is defined "too early"
fnTest = function (data) {
for (row in data)
{
if (data.hasOwnProperty(row))
{
console.log(data.row);
}
}
};
fnTest(d);
}
Per rendere le cose felici, spostare row
nella funzione interna. Anche se tecnicamente è ancora nel campo di applicazione, a JSLint non piace la "superscope" che è stata utilizzata prima.
function spam(d)
{
var fnTest;
fnTest = function (data) {
var row; // and JSLint is happy! ;^D
for (row in data)
{
if (data.hasOwnProperty(row))
{
console.log(data.row);
}
}
};
fnTest(d);
}
A proposito, James' preoccupazione è coperto dal controllo
hasOwnProperty
l'OP è inserito. Prendi quel controllo, e JSLint si lamenterà: "Il corpo di un for in dovrebbe essere racchiuso in un'istruzione if per filtrare le proprietà indesiderate dal prototipo".
Here's a little more on hasOwnProperty with for... in, if you're interested.
JSLint potrebbe non suggerirvi questo, ma io, per * iterare * un oggetto array (o un oggetto simile ad un array), raccomando sempre vivamente di usare un semplice ciclo 'for', l'istruzione' for-in' è pensato per essere usato per * enumerare * le proprietà dell'oggetto, con questa istruzione, anche se si usa il controllo 'hasOwnProperty' per evitare di enumerare le proprietà sulla catena del prototipo, l'ordine di iterazione è * non garantito * dalle specifiche, può essere arbitrario, quindi il ciclo potrebbe non visitare gli elementi nell'ordine numerico. Vedi anche: [Enumerazione vs. Iterazione] (http://bit.ly/9GPWDY) – CMS
@CMS che link è andato male, grazie per il suggerimento però, ho avuto questo problema pure. – Jordan
@Jordan, la pagina è stata salvata da archive.org, puoi vederlo [qui] (http://web.archive.org/web/20101213150231/http://dhtmlkitchen.com/?category=/JavaScript/&date = 2007/10/21/& entry = iterazione enumerazione-Primitivi-e-Objects). – CMS