Javascript 警告-危险使用此对象的全局变量

Javascript 警告-危险使用此对象的全局变量,javascript,google-closure,google-closure-compiler,Javascript,Google Closure,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 我只想将其更改为匿名方法,但我

在谷歌闭包编译器中,我得到了警告

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

这里有一个例子。错误行和偏移量指的是单词
this

function aToggle() {
  if(shown)
    toggle.show()
  else
    toggle.hide()
  $(this).text(shown ? 'Click to hide' : 'Click to show')
  shown = !shown
}
link.onclick = aToggle
我只想将其更改为匿名方法,但我正在文件中的其他位置重新使用
atogle
,因此需要对其进行命名


我可以将
atogle
标记为
/**@constructor*/
——但它不是一个构造函数。我是否可以使用另一个注释来消除此警告,或者我是否在将其标记为构造函数或显示一堆无用的警告之间徘徊?

我不太了解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);
从跨浏览器通用事件对象检索单击的目标

编辑:作为一条建议,在你的
{}
中使用
并使用分号,不要依赖你的浏览器为你做这件事


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

首先,您可能做错了。:-)

@简的想法是对的。但您可能应该遵循以下几点:

(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外部文件,告诉闭包编译器在jQuery中做什么:


如果您只是希望警告消息消失,请将
替换为
链接

编辑:我一直在阅读Closure:the definal Guide,我刚刚意识到您可以简单地在事件处理程序之前添加,以使Closure编译器停止抱怨

看。当您在一个函数中使用
this
时,如果该函数既不是带注释的
/**@constructor*/
函数,也不是类的
原型
函数,则闭包编译器会发出此警告。编译器假定,当在另一个对象的上下文中调用函数时(这就是事件回调所做的),您永远不会使用
this

您可能必须更改某些位置以使闭包编译器停止使用此警告进行抱怨:

  • 不要直接使用
    link.onclick=…
    ,因为你必须搞乱
    这个
    e | | window.event
    。相反,使用jQuery包装事件处理程序,因为
  • 如果在
    jQuery.each
    中使用
    this
    ,请将
    this
    替换为函数的第二个参数。例如,
    jQuery.each([1,2,3],函数(i,val){…val…};

好的,很容易制作。不管怎样:
显示的
切换
是全局的?我没有使用Google闭包编译器,但它可能不知道你的Atogle是一个事件处理程序。看看是否有地方可以告诉它,因为
这个
不需要全局
这个
。是的,我在ot中使用的是Atogle她的位置。上面的代码只是我写的一个例子。我在其他地方使用Atogle有一个最新的externs文件,所以我不能用
link
替换
。上面的代码只是我写的一个例子。谢谢你的回答,我很快就会尝试。@GeorgeBailey啊,我没有检查更新。时间太长了自从1.3.2版本以来,我认为它永远不会被更新。我会更新我的答案。你为什么认为我应该使用大括号和分号?“应该”可能有点强,但大括号确实可以提高用于分组代码的程序的可读性。分号:。但更重要的是,我的解决方案对你有用吗?我还没有测试过它,我知道我已经转移到其他项目,但我不会忘记接受正确的答案。我看了编译器,它实际上去掉了大括号并添加了分号,这很好。谢谢你提到它。