JSLint错误报告 - 这有什么问题?

时间:2010-05-22 02:48:45

标签: javascript jslint

我收到了这个错误,不知道原因是什么。有什么想法吗?

第2127行的问题18:在变量'sport'中不好。 for(sport in 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 个答案:

答案 0 :(得分:19)

尝试

var sport;
for (sport in sugested_sports)

这将处理缺少的变量声明并将其置于for循环之外(请参阅jsLint error "Cannot set property 'first' of undefined")。

答案 1 :(得分:17)

Pointy的答案可能是lint抱怨的答案。


作为一般规则,您在使用for (... in ...)时应该小心。人们常常将此构造与C#中的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);
}

我们这次最终会收到三个提醒,01method。这是我所指的意外行为。如果你知道它的作用,可以使用in,但我已经看到它不止一次地吸引人们。

以下两个例子都适用:

x = ['one', 'two'];
for (var i = 0; i < x.length; i++) {
  alert(i);
}

答案 2 :(得分:3)

JSHint / JSLint中的所有错误意味着您没有声明您的键/迭代器变量。作为@Christopher suggests,JSLint希望您将其声明放在其范围的顶部(google JavaScript hoisting了解有关提升的更多信息,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);

此处bad for in variable此错误与其他地方的'sport' was used before it was defined错误相同。


编辑:值得一提的是,如果您的for位于内部函数中,则需要在同一上下文中声明for in变量。如果您在父上下文中声明for in,JSLint会抱怨。

示例:

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);
}

<小时/> 顺便说一句,詹姆斯关注的是由OP插入的hasOwnProperty检查。取出那个检查,JSLint会抱怨,“for的主体应该包含在if语句中,以过滤原型中不需要的属性”。 Here's a little more on hasOwnProperty with for... in, if you're interested

答案 3 :(得分:2)

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

    for (sport in sugested_sports)
    {
        // 
    }