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)对jQuery
, ContainerA
和ContainerB
很满意,即使它们没有在当前文件中的任何地方定义。 第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的代码。