14

我收到此错误,不知道可能是什么原因。任何的想法?

第 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

4 回答 4

19

尝试

var sport;
for (sport in sugested_sports)

这会处理丢失的变量声明并将其放在 for 循环之外(请参阅jsLint 错误“无法设置属性 'first' of undefined”)。

于 2010-05-22T02:53:48.447 回答
17

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


不过,作为一般规则,您在使用for (... in ...). 人们经常将此构造与foreach来自 C# 或其他语言中的其他类似概念混淆,而实际上它并不相关。javascriptfor 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);
}

这次我们最终得到三个警报01、 和method。这是我所指的意外行为。如果您知道它的作用,就可以使用in它,但是我已经看到它不止一次地吸引人们。

以下适用于这两个示例:

x = ['one', 'two'];
for (var i = 0; i < x.length; i++) {
  alert(i);
}
于 2010-05-22T03:08:44.283 回答
3

JSHint/JSLint 中的所有错误意味着你没有声明你的 key/iterator variable。正如@Christopher 所建议的那样,JSLint 希望您在其范围的顶部声明它(谷歌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在相同的上下文中声明你的变量。如果您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);
}


顺便说一句,詹姆斯的担忧已被hasOwnPropertyOP 插入的支票所涵盖。取出该检查,JSLint 会抱怨,“for in 的主体应该包含在 if 语句中,以从原型中过滤掉不需要的属性”。 如果您有兴趣,这里有更多关于 hasOwnProperty 和 for... in 的内容

于 2013-02-05T20:20:04.953 回答
2
var sugested_sports = data.split(","),
    sport,
    sport_items = '';

    for (sport in sugested_sports)
    {
        // 
    }
于 2012-02-20T16:30:36.333 回答