Ответ 1
Try
var sport;
for (sport in sugested_sports)
Это относится к объявлению отсутствующей переменной и помещает ее за пределы цикла for (см. ошибка jsLint "Невозможно установить свойство 'first' из undefined" ).
Я получил эту ошибку и не знаю, что может быть причиной. Любая идея?
Проблема в строке 2127 символ 18: Плохо для переменной "спорт". для (спорт в sugested_sports)
// make array
var sugested_sports = data.split(",");
// pre build DIV
var sporty_items = '';
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);
спасибо alot.
Try
var sport;
for (sport in sugested_sports)
Это относится к объявлению отсутствующей переменной и помещает ее за пределы цикла for (см. ошибка jsLint "Невозможно установить свойство 'first' из undefined" ).
Поясничный ответ, вероятно, тот, о котором жалуется жало.
Как правило, вы, однако, должны быть осторожны при использовании for (... in ...)
. Люди часто путают эту конструкцию с foreach
с С# или другими аналогичными понятиями на других языках, когда на самом деле это не связано. Конструкция javascript for in
выполняет итерацию каждого члена объекта, а не только значения в коллекции, включая методы и свойства. Такое поведение часто приводит к неожиданным побочным эффектам, если вы не знаете, как это работает заранее.
Например:
x = ['one', 'two'];
for (var value in x) {
alert(value);
}
Это дает два предупреждения: первое сообщение 0
и второе 1
, в частности индексы коллекции.
Если мы немного изменим это значение:
x = ['one', 'two'];
x.method = function() {};
for (var value in x) {
alert(value);
}
На этот раз мы получим три оповещения, 0
, 1
и method
. Это неожиданное поведение, о котором я говорил. Хорошо использовать in
, если вы знаете, что он делает, но я видел, как он несколько раз ловил людей.
Ниже приводится описание обоих примеров:
x = ['one', 'two'];
for (var i = 0; i < x.length; i++) {
alert(i);
}
Все ошибки в JSHint/JSLint означают, что вы не указали переменную ключа/итератора. Как @Christopher предлагает, JSLint хочет, чтобы вы объявили его в верхней части своей области (google JavaScript hoisting
для получения дополнительной информации о подъеме, как эта ссылка):
/*global data, identifier, DIVsuggestions */
// We'll pretend all of the above were passed in from a function parameters
// by using JSLint "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);
Эта ошибка bad for in variable
здесь сводится к тому же, что и ошибка 'sport' was used before it was defined
в другом месте.
EDIT: Стоит отметить, что если ваш for
находится во внутренней функции, вам нужно объявить переменную for in
в том же контексте. JSLint будет жаловаться, если вы объявите for in
в родительском контексте.
Пример:
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);
}
Чтобы все было в порядке, переместите row
во внутреннюю функцию. Несмотря на то, что это было технически все еще в сфере охвата, JSLint не любит "суперскоп", который использовался раньше.
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);
}
hasOwnProperty
, который вставил OP. Выньте эту проверку, и JSLint будет жаловаться: "Тело a для in должно быть завернуто в оператор if для фильтрации нежелательных свойств из прототипа". Вот немного больше о hasOwnProperty с for... in, если вам интересно. var sugested_sports = data.split(","),
sport,
sport_items = '';
for (sport in sugested_sports)
{
//
}