Отчет об ошибке JSLint - Что не так с этим?

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

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

Решение

Пытаться

var sport;
for (sport in sugested_sports)

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

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


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

Все ошибки означают в JSHint/JSLint, что вы не объявили свою переменную ключ / итератор. Как подсказывает @Christopher, JSLint хочет, чтобы вы объявили его в верхней части его области (Google JavaScript hoisting больше о подъеме, как эта ссылка):

/*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 в родительском контексте.

Пример:

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

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

    for (sport in sugested_sports)
    {
        // 
    }
Другие вопросы по тегам