2011-09-29 18 views
37

私はResharperの6およびASP.NETのWebメソッドを使用して、私のJavaScriptファイルに刺激性の警告を持っている:ReSharperの、Javascriptを:「暗黙的に宣言されたグローバル変数 『X』の使用」

"Use of implicitly declared global variable 'X'" 

理由がありますWebメソッドはJavascriptで次のように作成されます:

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

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

私の質問は、正当に間違った状況のためにそれを取り除かずにこの状況のエラーを取り除くにはどうすればよいですか?

ありがとうございます!

+0

良い質問です。それは、それ自身の行が何も宣言していないので、奇妙な警告のようです。 Xが定義されていないと、実行時にエラーが発生します。 Xが他の場所で宣言されている場合は、警告を他の場所で取得する必要があります。 – nnnnnn

+2

R#JSのエンジンです。「ねえ、私はXを認識しません - 本当にここにいるはずですか?あなたが "XY"とタイプしたのに実際には "X"を意味し、R#があなたのベーコンを保存する場合、それは多くの意味があります。問題は、R#に "はい、これは本当にここにいるはずです"と伝える方法は見当たらないということです。 – rythos42

+2

'X'を' window.X'に変更しても文句はありますか?別のアイデア:C#では、 '// resharper disable whatever'と' // resharper enable whatever'(私は正確に覚えていません)に問題行をラップすることができます。あるいは、グローバルスコープで変数を明示的に定義することもできます: 'var X = window.X || {}; '。 – sethobrien

答えて

37

他のJavaScriptファイルで定義されているシンボル(関数、定数、グローバル変数)を使用するときは、現在のファイルのスコープ関数(トップレベル、通常は匿名、グローバル名前空間汚染を防ぐ関数)

multiple containers

あなたはスクリーンショットから見ることができるように、ReSharperの(6.0.2202.688)がjQueryContainerAと彼らは現在のファイルの任意の場所に定義されていないにもかかわらず、ContainerBに満足しています。 1行目のコメントは、JSLint(エラーなし)の場合のみです。

この技術は、他のすべてのJavaScriptファイルは、最低限、すべてのエクスポート(公共)記号が含まれている単一のトップレベルのオブジェクトを定義することによって、グローバルな名前空間を汚染するJavaScriptのベストプラクティスに従うことを前提とし(すなわちjQueryはグローバルだけですjQueryライブラリとそのプラグインのオブジェクトであるContainerAはLibraryAの唯一のグローバルオブジェクトであり、ContainerBはLibraryBの唯一のグローバルオブジェクトです。

あなたは明確にグローバル名前空間にコンストラクタ関数を生成するASP.NETのWebメソッドを制御することはできませんので、あなたのケースでは、あなたが究極のコンテナに頼る必要があり、window

window as a container

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

+0

JetBrainsの実際のソリューションを除いて、これはまだまだ良いアイデアだと思います。私は本当にプロセッサのディレクティブ、ala JSLint/JSHint :)を期待していました。つまり、「aspNet.Xはあなたの意図を宣言します」という部分が本当に好きです。アイデアをありがとう! – rythos42

+0

私はそれを取得しません。私は 'X'を呼び出すjavascript関数Button_onclickをどのように書くのですか? – comecme

+1

javascriptが.aspxページの途中にある場合はどうなりますか?スクリプトの直前に/ *グローバル* /コメントをaspxページに追加できますか?これを試して、Resharperはまだエラーについて私に警告しています。 (私はResharperは、JsLintのJavascriptのエラーを見つけるために同様のルールを使用していると仮定しています) –

4

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

変更を最小限に抑えるには、var X = window.X;をファイルの先頭近くに追加します。グローバル名前空間をポーリングしないようにして、ウィンドウ上にXを実際にインスタンス化するコードを混同しないようにしてください。

+2

これは役に立ちません - JSファイルはASP.NETフレームワークによって自動生成され、参照するファイルはありません。 – rythos42

+0

私は何か似たようなことをしましたが、実際には実際に使用されていない「偽の」JSファイルを参照しています。 ReSharperに不平を言うのを防ぐために必要なグローバル変数を手動で追加します。小さなグローバル・セットがある場合、これは正常に機能します。 –

6

Jasmineを外部のBowerパッケージに移動し、JasmineのコードをVSプロジェクトから除外しても、まったく同じ問題が発生しました。 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

+0

私はこれを角度にしようとしましたが、何らかの理由でグローバル変数をウィンドウ変数にバインドする必要がありました。 htmlファイル内のスクリプトの順序が原因である可能性があります。 var angular = window.angular; – Casey

関連する問題