警告 - 危险使用全局此对象

时间:2010-10-27 19:31:06

标签: javascript google-closure google-closure-compiler

在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*/ - 但它不是构造函数。是否有另一个注释我可以用它来消除这个警告,或者我是不是在将它标记为构造函数或者出现一堆无用的警告?

3 个答案:

答案 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 = ...,因为您必须使用thise || 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