Отчет об ошибке JSLint - Что не так с этим? - PullRequest
14 голосов
/ 22 мая 2010

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

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

спасибо.

Ответы [ 4 ]

19 голосов
/ 22 мая 2010

Попробуйте

var sport;
for (sport in sugested_sports)

Это заботится о пропущенном объявлении переменной и помещает его вне цикла for (см. Ошибка jsLint "Невозможно установить свойство 'first' из неопределенного" ).

17 голосов
/ 22 мая 2010

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


Как правило, вы должны соблюдать осторожность при использовании for (... in ...).Люди часто путают эту конструкцию с foreach из C # или другими подобными понятиями в других языках, хотя на самом деле это не связано.Конструкция 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 голосов
/ 06 февраля 2013

Все ошибки означают в JSHint / JSLint, что вы не объявили свою переменную ключ / итератор . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [*], * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * * * * * 100 *

/*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);

Эта ошибка bad for in variable здесь сводится к той же, что и ошибка 'sport' was used before it was defined в другом месте.


РЕДАКТИРОВАТЬ: Стоит отметить, что если ваш for находится во внутренней функции, вам необходимо объявить переменную for in в том же контексте. JSLint будет жаловаться, если вы объявите for in в родительском контексте.

* * 1 022 Пример: * 1 023 *
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 будет жаловаться: «Тело for in должно быть заключено в оператор if для фильтрации нежелательных свойств из прототипа». Вот еще немного о hasOwnProperty с for ... in, если вам интересно .
2 голосов
/ 20 февраля 2012
var sugested_sports = data.split(","),
    sport,
    sport_items = '';

    for (sport in sugested_sports)
    {
        // 
    }
...