我正在使用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方法框架创建。
我的问题是:如何摆脱这种情况的错误,而不是在合法的错误情况下摆脱它?
谢谢!
答案 0 :(得分:41)
当使用其他JavaScript文件中定义的符号(函数,常量,全局变量)时,我将它们作为参数传递给当前文件的“作用域函数”(顶层,通常是匿名的,防止全局命名空间污染的函数): / p>
从屏幕截图中可以看出,ReSharper(6.0.2202.688)对jQuery
,ContainerA
和ContainerB
感到满意,即使它们未在当前文件中的任何位置定义。第1行中的注释仅适用于JSLint(无错误)。
此技术假设所有其他JavaScript文件都遵循JavaScript最佳实践,即通过定义包含所有导出( public )符号的单个顶级对象来最小化污染全局命名空间(即{ {1}}是jQuery库及其插件的唯一全局对象,jQuery
是LibraryA的唯一全局对象,ContainerA
是LibraryB的唯一全局对象,等等。
因为您显然无法控制ASP.NET Web方法将构造函数生成到全局命名空间中,所以在您的情况下,您必须求助于最终容器ContainerB
:
@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