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

Resharper,Javascript:“;使用隐式声明的全局变量';X'&引用;,javascript,resharper,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…是隐式定义的。我想知道是否有一个明确定义这个的解决方案?它是在一些自

我正在使用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.NETWeb方法框架创建

我的问题是:我如何消除这种情况下的错误,而不消除合法错误情况下的错误

谢谢

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

从屏幕截图中可以看到,ReSharper(6.0.2202.688)对
jQuery
ContainerA
ContainerB
很满意,尽管它们在当前文件中没有定义。第1行中的注释仅用于JSLint(无错误)

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

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


这是@sethobrien在其评论中建议的技术的一个细微变化。一个重要的(IMHO)优势是您没有将
window.X
硬编码到代码中。相反,您的代码是从
aspNet
容器实例化类(目前这恰好是
window
的同义词,但将来可能会发生变化)。此外,在代码中加入
aspNet.X
,可以更清楚地向将来阅读您的代码的人表明您的意图。最后,可以通过JavaScript最小化来缩短局部变量,从而生成传输到客户端浏览器的稍小文件。

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


否则,为了最大限度地减少更改,您可以在文件顶部附近添加
var X=window.X;
。尽量避免使用全局命名空间,并确保不会混淆窗口上实际实例化X的代码。

在将Jasmine移到外部Bower包并从中排除Jasmine的代码后,遇到了完全相同的问题VS project.Resharper立即开始抱怨<代码>使用隐式声明的全局变量“descripe”等等

我通过向项目中添加另一个名为
workaround.js
dummy definitions的文件来解决这个问题。在您的例子中,它是:

// 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 () { };

这是我项目中的一个文件-。

如果它是一个可以忽略的错误,您可以使用它

// ReSharper disable once UseOfImplicitGlobalInFunctionScope

好问题。这似乎是一个奇怪的警告,因为该行本身没有声明任何内容。如果没有定义X,则在运行时会出现错误;如果在其他位置声明X,则应该在其他位置得到警告。这是R#JS引擎说的“嘿,我不认识X-X真的应该在这里吗?”在键入“XY”的情况下,这很有意义但真正的意思是“X”和“R”拯救了你的培根。问题是我没有办法告诉“是的,这真的应该在这里!”如果您将
X
更改为
window.X
,它还会抱怨吗?另一个想法是:在C#中,您可以在
//resharper disable which
//resharper enable which
中包装一行问题(我不记得很清楚),所以我希望他们会对js执行类似的操作。或者您可以在全局范围内显式定义变量:
var X=window.X |{};
。这些都是好主意,sethobrien!“window。”消除了抱怨,尽管它不是很好看。我想我希望JSHint/JSLint style/*globals部分可以显式地说“是的,我知道这是在别处定义的。”这没有帮助-JS文件是由ASP.NET框架自动生成的,我没有可引用的文件。我做了类似的事情,但我引用了一个“假的”“实际生产中未使用的JS文件。我手动添加了我需要的全局文件,以防止ReSharper抱怨。如果您有一小组已定义的全局文件,这应该可以工作。刚才我修复了
reference
中的键入错误。这很有帮助。您必须将这些引用放在文件的顶部,甚至在
的上方。”;
。除非JetBrains提供实际解决方案,否则我认为这是迄今为止最好的主意。我真的希望有一个处理器指令,ala JSLint/JSHint:)。也就是说,我非常喜欢“aspNet.X声明您的意图”部分。非常感谢这个想法!我不明白。我怎么写一个JavaScript函数ButoNo.OnCutt,它调用<代码> x>代码>?如果你的JavaScript在ASPX页面的中间,会发生什么?你可以在脚本之前添加/*Global */Apple到你的ASPX页面吗?已经尝试过了,ReSalpB仍然警告我一个错误。(我假设Resharper使用与Javascript的JsLint类似的规则来查找错误)这对我不起作用。我可能键入了一些错误,我承认我没有遵循这里的逻辑。我尝试了angular,出于任何原因,我不得不将全局变量绑定到窗口变量。可能是由于html文件中的脚本顺序。var angular=window.angular;谢谢。回答得很好