8

在 Google Closure Compiler 中,我收到警告

警告 - 危险地使用全局 this 对象

这是一个例子。错误行和偏移量是指单词的开头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*/-- 但它不是构造函数。是否有另一个注释可以用来消除此警告,或者我是在将其标记为构造函数还是出现一堆无用的警告之间陷入困境?

4

3 回答 3

14

编辑:我一直在阅读 Closure: The Definitive Guide,我刚刚意识到您可以简单地在事件处理程序之前添加/** @this {Element} */注释以使 Closure Compiler 停止抱怨。

请参阅Closure Compiler 警告参考。当你this在一个没有注释的函数中使用/** @constructor */或者在prototype一个类中使用时,闭包编译器会给出这个警告。编译器假定您永远不会this在另一个对象的上下文中调用函数时使用(这是事件回调所做的)。

您可能需要更改某些地方以使 Closure Compiler 停止抱怨此警告:

  • 不要link.onclick = ...直接使用,因为你要弄乱thisand e || window.event。相反,使用 jQuery 来包装事件处理程序,因为jQuery 的事件对象具有e.currentTarget.
  • 如果您this在 a中使用jQuery.each,请替换this为函数的第二个参数。例如,jQuery.each([1, 2, 3], function(i, val) { ... val ... };
于 2010-10-29T10:19:46.413 回答
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 外部文件告诉 Closure Compiler 在 jQuery 中做什么:http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.4.3.externs。 js

如果您只想让警告消息消失,请替换thislink.

于 2010-10-27T20:14:28.003 回答
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和使用分号,不要依赖你的浏览器为你做这件事。

为了充分利用闭包工具,建议将闭包库与编译器结合使用(尽管不是必需的)

于 2010-10-27T19:51:47.130 回答