resharper,Javascript:“使用隐式声明的全局variables'X'”

我正在使用Resharper 6和ASP.NET Web方法,并在我的JavaScript文件中有一个恼人的警告:

"Use of implicitly declared global variable 'X'" 

原因是web方法是在Javascript中创build的:

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

而X …是隐式定义的。 我想知道是否有解决scheme明确定义这个? 它在一些自动生成的JS文件中定义,由ASP.NET web方法框架创build。

我的问题是:如何摆脱这种情况的错误,而不是摆脱合法的错误情况呢?

谢谢!

当使用在其他JavaScript文件中定义的符号(函数,常量,全局variables)时,我将它们传递给当前文件的“作用域函数”(顶层,通常为匿名,防止全局名称空间污染)作为参数:

多个容器

从截图中可以看出,ReSharper(6.0.2202.688)对jQueryContainerAContainerB很满意,即使它们没有在当前文件中的任何地方定义。 第1行中的注释仅针对JSLint(没有错误)。

这种技术假设所有其他JavaScript文件遵循JavaScript最佳实践,通过定义包含所有导出( 公共 )符号的单个顶级对象(即, jQuery是jQuery库的唯一全局对象及其插件, ContainerA是LibraryA的唯一全局对象, ContainerB是LibraryB的唯一全局对象等)。

因为你显然不能控制生成构造函数到全局命名空间的ASP.NET Web方法,在你的情况下,你必须诉诸最终的容器, window

窗口作为一个容器

这是@sethobrien在他的评论中提出的技术的一个细微的变化。 一个重要的(恕我直言)的优势是,你不hard-coding到你的代码window.X 。 相反,你的代码正在实例化aspNet容器中的类(目前恰好是window的同义词,但是将来可能会改变)。 另外,在代码中使用aspNet.X将会更清楚地向那些将来会阅读你的代码的人宣布你的意图。 最后,可以通过JavaScript最小化来缩短局部variables,从而产生稍微小一点的文件传输到客户端浏览器。

将Jasmine移动到外部的Bower包并从VS项目中排除Jasmine的代码后,得到完全相同的问题。 Resharper立即开始抱怨使用Use of an implicitly declared global variable 'describe'等等。

我通过在项目中添加另一个名为workaround.js虚拟variables定义来解决这个问题。 在你的情况下,这将是:

 // 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开始查看此全局variables。

否则,为了尽量减less变化,你可以添加var X = window.X; 靠近文件的顶部。 尝试使其不会影响全局命名空间,并确保它不会混淆实际在窗口上实例化X的代码。