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

时间:2011-09-29 23:17:36

标签: javascript resharper

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

"Use of implicitly declared global variable 'X'"

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

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:41)

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

multiple containers

从屏幕截图中可以看出,ReSharper(6.0.2202.688)对jQueryContainerAContainerB感到满意,即使它们未在当前文件中的任何位置定义。第1行中的注释仅适用于JSLint(无错误)。

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

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

window as a container

@sethobrien在评论中提出的技术略有不同。一个重要的(IMHO)优势是您不会在代码中硬编码window。相反,您的代码正在实例化window.X容器中的类(此时恰好是aspNet的同义词,但将来可能会发生变化)。此外,在代码中使用window可以为将来阅读代码的人更清楚地表明您的意图。最后,JavaScript最小化器可以缩短局部变量,从而产生稍微小一点的文件传输到客户端浏览器。

答案 1 :(得分: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 () { };

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

如果是可以忽略的错误,则可以使用

// ReSharper disable once UseOfImplicitGlobalInFunctionScope