JSLintメッセージ:未使用の変数


80

このようなシナリオで「i」が未使用の変数であるとJSLintが文句を言った場合、どうすればよいですか。

var items = "<option selected></option>";
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

(i、item)はパラメータの必須順序であり、私は「item」のみを使用しています。

未使用の変数を許容するか、$。eachを書き換えてインデックスを使用する以外の解決策はありますか?どちらの解決策も私はしたくないですか?

前もって感謝します。

更新:私はすべての提案に感謝しますが、このコードは私が何を意味するかを示すための単なる例であり、もしあれば、一般的な解決策を見たいと思っています。ありがとう。


6
この特定のケースではthis= itemapi.jquery.com/jQuery.eachなので、どちらのパラメーターも使用する必要はありません。しかし、この質問はおそらくもっと一般的な意味で答えられるべきです。
グレッグ

できればとてもいいです$.each(data, function (, item)
oscaralexander 2014

多くの人_未使用のパラメータを使用しますがJSLintに特に無視するように指示する方法はありません_が、それは本当に素晴らしいことです。
David J.

回答:


79

試してみてください:

var items = "<option selected></option>";
/*jslint unparam: true*/
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});
/*jslint unparam: false*/  // so that you still get warnings from other functions

+1。これは、同様の状況で私にとってうまく機能し、影響を受けたラインの直前と直後に配置することができました。ありがとう!
Ed Bayiates 2012年

4
:あなたはjQueryのイテレータを使用してオブジェクトの配列をiとあなたのしている反復処理を使用していないので、あなたは「この」使用することができます$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})

3
これが最善の方法です。/ * jslint unparam:true * /
Foxinni 2013

1
関数を削除します:)

2
unparamJSLintではサポートされなくなりました。代わりに、ignore以下の回答で説明されている新しいキーワードを提供します。
oyenamit 2015

24

これは新しいものに違いないと思います:http//www.jslint.com/help.html

「JSLintは新しい予約語を導入します:無視する」

したがって、上記は単純に次のようになります。

$.each(data, function (ignore, item) {

i =>無視...簡単すぎる。残りのコードは同じままで、ブラウザは満足し、JSLintは満足しています


以前の(間違った)答え:

JsLintとブラウザの両方を使用するには、次のものを使用する必要がありました。

function (d, i) {
        if (undefined !== win.undefined) {
            undefined(d);
        }
        return (i);
}

undefinedが関数ではないため、ブラウザが「undefined(d)」でクラッシュしました。したがって、ブラウザを使用している場合、「undefined!== win.undefined」はその行をスキップします。


14
ignore警告を抑制するこの新しい方法は、同じ関数に複数の未使用のパラメーターがある場合に機能しなくなります。
oyenamit 2015

(parameter、ignore、ignore1、ignore2、value、ignore3)を使用できますが、少なくともWebstorm for Macでは、警告を抑制する広告が機能しています
Paul N

1

あなたはこれを行うことができます:

var items = "<option selected></option>";
$.each(data, function () {
    var item = arguments[1];
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

...しかし、私に言わせれば、それはおそらくもっと悪いことです。


1
@ Schroedinger-そうそう、確かに。これは常にJSLintとのトレードオフです。あなたは自分で決める必要があります。
nickf 2011

8
1つの警告を修正し、別の「JS Lint:名前付きパラメーターを使用する」を引き起こします:)

1

かなり自己文書化された方法で警告を取り除くための可能な方法は、次のように、未使用の変数を使用させることです。

// Utility function in project scope:
function unusedVariables(/* Put all your deliberately unused variables here */) {
    // pass
}

// And then, later:
var items = "<option selected></option>";
$.each(data, function (i, item) {
    unusedVariables(i); //< This is the new and magical line
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

もちろん、変数を未使用としてマークし、それをどこかで使用する状況に入ることができます。また、コンテキストによっては、この方法が冗長すぎる場合があります。

この方法には、正確であるという利点があります。使用範囲/*jslint unparam*/が広すぎる可能性があります。


4
これは、JSLintの「空のブロック」テストに失敗する可能性があります。
jokeyrhyme 2013

4
この回答は「機能」しますが、使用しないことをお勧めします。私は「解決策は問題よりも悪い」の下でそれを提出します。
David J.

1
このソリューションの何が悪いのか、@ superluminaryとDavidJamesについて詳細を追加していただければ、他の読者にとってより役立つでしょう。私はこの解決策を嫌う人々に問題はありませんが、それだけでは誰の助けにもならないというコメントを追加します。:)
マグヌスホフ2014

6
マグナス、コメントを削除しました。私がこのソリューションを嫌う理由は、特定のバリデーターの特定のバージョンをだましてコードを渡すためだけに、非セマンティックコードを追加しているためです。これはハックであり、コードに意味を追加せず、古くなりません。適切な解決策は、JSLintを変更することです。
スーパールミナリー2014

@superluminary詳しく説明していただきありがとうございます:)
Magnus Hoff

1

void意図的に変数を使用していないことを明示するために使用するのはどうですか?

$.each(data, function (i, item, any, other, unused, vars) {
  void(i, any, other, unused, vars);
  items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

これは、上書きが予想されるが署名を表示したい抽象関数や、引数を無視しているがモックされた関数の署名と一致させたいモックでも役立ちます。


3
voidを使用してもJSLintに合格しないようです
xorcus 2013

void原因の使用Expected 'undefined' and instead saw 'void'undefined(i, any, other, unused, vars);ただし、パスJSLintを使用します。
maheshsenni 2014

1

「i」の名前を「unused」に変更します。それでも明らかにエラーが残りますが、リストに表示され、そのエラーを「チェック」して問題がないことがわかります。


これは悪い考えではありませんが、継続的インテグレーションを行い、コードのマージを許可する前にすべてのコードをリントしたい場合、警告をエラーとして扱っていると、これは機能しません。

1
この回答で述べたように、未使用の変数の名前を「ignore」に変更すると、JSLintによって検証されます。したがって、「未使用」ではなく「無視」すれば、すべて設定されます(制限:同じ関数で未使用の変数を1つだけサポートします)
Emilien 2017


0

関数に複数の未使用のパラメーターがある場合は、次のように「無視」を使用できます。

function (ignoreFoo, ignoreBar, baz) {
}

予約語「ignore」(ignore、ignoreFoo、ignoreBarなど)で始まる必要があります。


これは、PuZZleDucKの回答と実質的に同じです。すでにいくつかあるときに回答を追加する場合、特にそれらがはるかに古く、すでに賛成している場合は、別の回答を繰り返すだけではないことを確認してください。違いがある場合は、他の回答を明示的に引用して指摘してください。明らかに違いがあります。ありがとうございました!
ファビオは2017

2
次のコード(3つの未使用変数)では、最初の「ignore」のみがJSLint検証に合格し、最後の2つのパラメーターが「Unused'ignoreOne '」と「Unused'ignoreTwo'」をトリガーしますvideos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
Emilien 2017

'ignoreInterval'が宣言されていますが、その値が読み取られることはありません。今、私は長いエラー:(取得
noob7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.