14

このエラーが発生しましたが、何が原因なのかわかりません。何か案が?

行 2127 文字 18 の問題: 変数 'sport' に不適切です。for (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' を設定できません"を参照)。

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

これにより、最初の contaning0と 2 番目のアラート1、特にコレクションのインデックスの 2 つのアラートが生成されます。

これを少し変更すると、次のようになります。

x = ['one', 'two'];
x.method = function() {};
for (var value in x) {
  alert(value);
}

今回は0、 、1の 3 つのアラートが発生しmethodます。これは、私が言及していた予期しない動作です。機能を理解していれば問題なく使用inできますが、私はそれが人々を惹きつけるのを複数回見てきました。

以下は、両方の例で機能します。

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

JSHint / JSLintのすべてのエラーは、キー/イテレータ変数を宣言しなかったことを意味します。@Christopherが示唆しているように、JSLintは、スコープの上部で宣言することを望んでいます(このリンクのようJavaScript hoistingに、巻き上げの詳細についてはgoogleを参照してください)。

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


ちなみに、ジェームズの懸念はhasOwnProperty、OPが挿入したチェックでカバーされています。そのチェックを外すと、JSLintは「プロトタイプから不要なプロパティをフィルタリングするために、forinの本体を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 に答える