在Google Closure Compiler中,我收到了警告
警告 - 危险使用全局此对象
这是一个例子。错误行和偏移量指的是单词this
function aToggle() {
if(shown)
toggle.show()
else
toggle.hide()
$(this).text(shown ? 'Click to hide' : 'Click to show')
shown = !shown
}
link.onclick = aToggle
我只是将其更改为匿名方法,但我在文件的其他位置重新使用aToggle
,因此需要将其命名。
我可以将aToggle
标记为/**@constructor*/
- 但它不是构造函数。是否有另一个注释我可以用它来消除这个警告,或者我是不是在将它标记为构造函数或者出现一堆无用的警告?
答案 0 :(得分:13)
编辑:我一直在阅读Closure:The Definitive Guide,我刚刚意识到您可以在事件处理程序之前添加/** @this {Element} */
annotation,以使Closure Compiler停止抱怨。< / p>
请参阅Closure Compiler warning reference。当您在未注释this
或位于类/** @constructor */
内的函数中使用prototype
时,Closure Compiler会发出此警告。编译器假定在另一个对象的上下文中调用函数时,你永远不会使用this
。这是事件回调的作用。
您可能需要更改某些地方以使Closure Compiler停止抱怨此警告:
link.onclick = ...
,因为您必须使用this
和e || window.event
。相反,使用jQuery来包装事件处理程序,因为jQuery's event object has e.currentTarget
。this
内使用jQuery.each
,请将this
替换为您的函数的第二个参数。例如,jQuery.each([1, 2, 3], function(i, val) { ... val ... };
。答案 1 :(得分:1)
我不太了解JQuery,但我认为你可以使用类似的东西:
function aToggle(event) {
if(shown) {
toggle.show();
} else {
toggle.hide();
}
$(event.target).text(shown ? 'Click to hide' : 'Click to show');
shown = !shown;
}
$(link).bind('click', aToggle);
从跨浏览器通用事件对象中检索单击的目标。
编辑:作为建议,请将{ }
与if else
一起使用并使用分号,不要依赖浏览器为您执行此操作。
为了充分利用闭包工具,建议将闭包库与编译器结合使用(尽管不是必需的)
答案 2 :(得分:1)
首先,你可能做错了。 : - )
@Jan有正确的想法。但你可能应该采取以下措施:
(function(){
var toggle = $("#toggle");
$("#yourLinksID, .orClassName").click(function(e) {
var shown = toggle.toggle().is(":visible");
$(this).html(shown ? "Click to hide" : "Click to show");
e.preventDefault();
});
}());
并在编译时:
使用以下jQuery externals文件告诉Closure Compiler jQuery中的内容:http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs.js
如果您只是希望警告消息消失,请将this
替换为link
。