2011-09-29 43 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-- X應該真的在這裏嗎?」如果您輸入「XY」,但確實意味着「X」和R#保存了您的培根,則這很有意義。問題是,我沒有看到一種告訴R#的方法:「是的,這真的應該在這裏!」 – rythos42

+2

如果您將'X'更改爲'window.X',它仍然抱怨嗎?另一個想法是:在C#中,你可以在'resharper禁用任何'和'// resharper啓用任何'(我不記得確切)包裝問題行,所以我希望他們會爲js做類似的事情。或者你可以在全局範圍中顯式定義變量: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在他的評論中提出的技術略有差異。一個重要的(恕我直言)優勢是,您不會將window.X硬編碼到您的代碼中。相反,您的代碼正在實例化aspNet容器中的類(目前恰好是window的同義詞,但未來可能會發生變化)。此外,在代碼中使用aspNet.X可以更清楚地爲將要閱讀代碼的人員更清楚地表達您的意圖。最後,可以通過JavaScript最小化來縮短局部變量,從而產生稍小的文件傳輸到客戶端瀏覽器。

+0

除了JetBrains的實際解決方案,我認爲這是最好的主意。我真的希望有一個處理器指令,ala JSLint/JSHint :)。 這就是說 - 我真的很喜歡「aspNet.X聲明你的意圖」部分。非常感謝這個想法! – rythos42

+0

我不明白。我將如何編寫一個調用'X'的javascript函數Button_onclick? – comecme

+1

如果您的javascript位於.aspx頁面中間,會發生什麼情況?您可以在腳本之前將/ * global */comment添加到您的aspx頁面嗎?試過這個,Resharper仍然警告我有關錯誤。 (我假設Resharper使用類似的規則來查找錯誤,因爲它的Javascript使用了JsLint) –

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包並從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

+0

我試過這個角度,無論出於什麼原因,我不得不將全局變量綁定到窗口變量。可能是由於HTML文件中的腳本順序。 var angular = window.angular; – Casey