web-dev-qa-db-ja.com

Resharper、Javascript:「暗黙的に宣言されたグローバル変数 'X'の使用」

Resharper 6とASP.NET Webメソッドを使用していますが、Javascriptファイルにいらいらする警告があります。

"Use of implicitly declared global variable 'X'"

その理由は、WebメソッドがJavascriptで次のように作成されるためです。

new X.example().webMethod(arg1, arg2, successCallback, failureCallback);

そしてX ...は暗黙的に定義されます。これを明示的に定義する解決策があるのだろうか? ASP.NET Webメソッドフレームワークなどによって作成された自動生成されたJSファイルで定義されています。

私の質問は、合法的に間違った状況でエラーを取り除くことなく、この状況のエラーをどのように取り除くのですか?

ありがとう!

46
rythos42

他のJavaScriptファイルで定義されているシンボル(関数、定数、グローバル変数)を使用する場合、それらをパラメーターとして現在のファイルの「スコープ関数」(グローバルな名前空間の汚染を防ぐトップレベル、通常は匿名の関数)に渡します。

multiple containers

スクリーンショットからわかるように、ReSharper(6.0.2202.688)は、現在のファイルのどこにも定義されていなくても、jQueryContainerA、およびContainerBに満足しています。 1行目のコメントは、JSLintにのみ存在します(エラーなし)。

この手法は、他のすべてのJavaScriptファイルが、エクスポートされたすべての(public)シンボル(すなわちjQueryはjQueryライブラリとそのプラグインの唯一のグローバルオブジェクト、ContainerAはLibraryAの唯一のグローバルオブジェクト、ContainerBはLibraryBの唯一のグローバルオブジェクトなどです。

明らかに、コンストラクター関数をグローバル名前空間に生成するASP.NET Webメソッドを制御できないため、最終的なコンテナーwindowに頼る必要があります。

window as a container

これは、@ sethobrienのコメントで提案された手法のわずかなバリエーションです。 (IMHO)の重要な利点は、ハードコーディングしないことですwindow.Xあなたのコードに。代わりに、コードはaspNetコンテナからクラスをインスタンス化します(現時点ではwindowの同義語ですが、将来変更される可能性があります)。また、aspNet.Xは、コードを将来読む人のために、コードの意図をより明確に宣言しています。最後に、ローカル変数はJavaScriptミニマイザーによって短縮され、クライアントブラウザーに送信されるファイルがわずかに小さくなります。

41
Milan Gardian

Jasmineを外部Bowerパッケージに移動し、VSプロジェクトからJasmineのコードを除外した後、まったく同じ問題が発生しました。 Resharperはすぐに_Use of an implicitly declared global variable 'describe'などに関する苦情を申し立て始めました。

これを解決するために、変数にworkaround.jsダミー定義という名前の別のファイルをプロジェクトに追加しました。あなたの場合は次のようになります:

// This is a workaround for R# complaining on undefined global variables.
// In practice they come from and are defined by external frameworks, so 
// this is not a real issue.

var X = function () { };

そして、これは私のプロジェクトのファイルです https://Gist.github.com/barahilia/62871d9219cee825d82e

7
Ilia Barahovski

スクリプトファイル///<refernce path="my.js" />(my.jsはXが定義されているファイルです)の先頭に以下を追加すると、ReSharperがこのグローバル変数を見始めるため、この警告が修正される可能性があります。

それ以外の場合は、変更を最小限に抑えるために、ファイルの上部近くにvar X = window.X;を追加できます。グローバル名前空間を汚染しないようにし、実際にウィンドウ上でXをインスタンス化するコードを混乱させないようにしてください。

5
Alexei Levenkov

無視できるエラーの場合は、使用できます

// ReSharper disable once UseOfImplicitGlobalInFunctionScope
1
floralGhost