JSLint Error Report - Что случилось с этим?

Я получил эту ошибку и не знаю, что может быть причиной. Любая идея?

Проблема в строке 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.

Ответы

Ответ 2

Поясничный ответ, вероятно, тот, о котором жалуется жало.


Как правило, вы, однако, должны быть осторожны при использовании 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);
}

Ответ 3

Все ошибки в 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, если вам интересно.

Ответ 4

var sugested_sports = data.split(","),
    sport,
    sport_items = '';

    for (sport in sugested_sports)
    {
        // 
    }