Resharper,Javascript:"使用隐式声明的全局变量'X'"

ryt*_*s42 46 javascript resharper

我正在使用Resharper 6和ASP.NET Web方法,并在我的Javascript文件中发出令人恼火的警告:

"Use of implicitly declared global variable 'X'"
Run Code Online (Sandbox Code Playgroud)

原因是Web方法是在Javascript中创建的:

new X.example().webMethod(arg1, arg2, successCallback, failureCallback);
Run Code Online (Sandbox Code Playgroud)

并且X ...是隐式定义的.我想知道是否有明确定义的解决方案?它是在一些自动生成的JS文件中定义的,由ASP.NET Web方法框架创建.

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

谢谢!

Mil*_*ian 41

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

多个容器

正如你从截图中可以看到,ReSharper的(6.0.2202.688)很满意jQuery,ContainerAContainerB即使他们没有在当前文件的任何地方定义.第1行中的注释仅适用于JSLint(无错误).

此技术假定所有其他JavaScript文件都遵循JavaScript最佳实践,即通过定义包含所有导出(公共)符号的单个顶级对象(即jQueryjQuery库及其插件的唯一全局对象)来最小化污染全局命名空间,ContainerA是LibraryA唯一的全局对象,ContainerB是LibraryB的唯一全局对象,等等.

因为您显然无法控制ASP.NET Web方法将构造函数生成到全局命名空间中,所以在您的情况下,您必须求助于终极容器window:

窗口作为容器

这是@sethobrien在评论中提出的技术略有不同.一个重要的(恕我直言)优势是您不需要window.X对代码进行硬编码.相反,您的代码是从aspNet容器中实例化类(目前恰好是它的同义词window,但将来可能会改变).此外,aspNet.X在代码中,对于将来会阅读您的代码的人来说,更清楚地宣告您的意图.最后,JavaScript最小化器可以缩短局部变量,从而产生稍微小一点的文件传输到客户端浏览器.


Ili*_*ski 7

将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 () { };
Run Code Online (Sandbox Code Playgroud)

这是我项目中的一个文件 - https://gist.github.com/barahilia/62871d9219cee825d82e.


Ale*_*kov 5

添加以下脚本文件的顶部///<reference path="my.js" />(my.js是定义X的文件)可能会修复此警告,因为ReSharper开始看到此全局变量.

否则,为了尽量减少更改,您可以var X = window.X;在文件顶部附近添加.尝试使其不要对全局命名空间进行轮询,并确保它不会混淆在窗口上实际实例化X的代码.

  • 这没有用 - JS文件是由ASP.NET框架自动生成的,我没有要引用的文件. (2认同)