2011-09-29 102 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