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ファイルで定義されています。
私の質問は、合法的に間違った状況でエラーを取り除くことなく、この状況のエラーをどのように取り除くのですか?
ありがとう!
他のJavaScriptファイルで定義されているシンボル(関数、定数、グローバル変数)を使用する場合、それらをパラメーターとして現在のファイルの「スコープ関数」(グローバルな名前空間の汚染を防ぐトップレベル、通常は匿名の関数)に渡します。
スクリーンショットからわかるように、ReSharper(6.0.2202.688)は、現在のファイルのどこにも定義されていなくても、jQuery
、ContainerA
、およびContainerB
に満足しています。 1行目のコメントは、JSLintにのみ存在します(エラーなし)。
この手法は、他のすべてのJavaScriptファイルが、エクスポートされたすべての(public)シンボル(すなわちjQuery
はjQueryライブラリとそのプラグインの唯一のグローバルオブジェクト、ContainerA
はLibraryAの唯一のグローバルオブジェクト、ContainerB
はLibraryBの唯一のグローバルオブジェクトなどです。
明らかに、コンストラクター関数をグローバル名前空間に生成するASP.NET Webメソッドを制御できないため、最終的なコンテナーwindow
に頼る必要があります。
これは、@ sethobrienのコメントで提案された手法のわずかなバリエーションです。 (IMHO)の重要な利点は、ハードコーディングしないことですwindow.X
あなたのコードに。代わりに、コードはaspNet
コンテナからクラスをインスタンス化します(現時点ではwindow
の同義語ですが、将来変更される可能性があります)。また、aspNet.X
は、コードを将来読む人のために、コードの意図をより明確に宣言しています。最後に、ローカル変数はJavaScriptミニマイザーによって短縮され、クライアントブラウザーに送信されるファイルがわずかに小さくなります。
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 。
スクリプトファイル///<refernce path="my.js" />
(my.jsはXが定義されているファイルです)の先頭に以下を追加すると、ReSharperがこのグローバル変数を見始めるため、この警告が修正される可能性があります。
それ以外の場合は、変更を最小限に抑えるために、ファイルの上部近くにvar X = window.X;
を追加できます。グローバル名前空間を汚染しないようにし、実際にウィンドウ上でXをインスタンス化するコードを混乱させないようにしてください。
無視できるエラーの場合は、使用できます
// ReSharper disable once UseOfImplicitGlobalInFunctionScope