2014-02-16 37 views
2

我使用的IDE(Cloud 9)包含JSHint,当它检测到错误时给我一个警告。作为一个原则,我尝试纠正我的代码以纠正这些错误。还有一个,我现在有我不能看到周围的方式:为什么JSHint提醒我在回调函数中使用'this'?

$("#component-manager tr:not(.edit-component) td").on("click", function() { 
    if ($(this).index() !== 0) { 
     var checkbox = $(this).parent().find("input[name=component-selected]"); 
     checkbox.trigger("click"); 
    } 
}); 

此代码给我一个警告:“在回调函数‘this’使用”。

我有两个问题:

  1. 我应该怎么做才能提高我的代码,并摆脱这一警告的。
  2. 为什么在回调函数中不使用this更好的做法(因为这是JSHint试图推广的)?
+0

我会考虑在IDE中的错误或配置错误。在像这样的jQuery回调中使用'this'是明确和热情的鼓励。 – Pointy

+0

JShint不给我任何警告或错误。 –

+1

您可以使用'function(e){$(e.target)...'而不是'function(){$(this)...' – lordvlad

回答

4

您的代码没有任何问题,也没有任何“更好”的方式来编写代码。这只是jsHint所做的事情,也许仅仅是因为有些人在其他类型的回调中使用this时会犯错误。

有一条评论,你可以插入你的代码,这将告诉js提示忽略这个特定的用途。我会去看看,如果我找到它,并将其添加到我的答案,如果我找到它。对于jsHint:http://www.jshint.com/docs/options/#validthis,您可以使用validthis选项来忽略特定功能的此警告。

我还没有尝试过自己,但根据文档,你可以添加这功能:

/* jshint validthis: true */ 

或者,配置文件可以用jshint被用来改变默认此选项(你必须弄清楚在IDE中如何做到这一点)。

1

该代码没有问题,您的IDE只是不聪明。在我的IDE中,函数总是返回一些东西,但由于我使用了条件if和else,它给了我一个警告,可能没有东西会被返回并添加'void'(使用XCode)。做我所做的事,并忽略它。

如果你的错误极端,而且这只是发生在使用this,你可以做什么lordvlad说,用function(e){e.target取代$(this)

+0

我现在正在做你的建议。它并没有太多的bug,但是正如@OregonTrail所建议的那样,我认为这是一个更好的解决问题的方法。 – microbug

+0

@ jfriend00我想这是一个效率较低的机制:我可以忍受这个错误! (改变答案...) – microbug

1

这来自通常错误实施的this that模式。一个例子见this question

通常有更好的方法来获得对所讨论对象的引用。在这种情况下,您需要为回调函数声明一个参数,并明确引用该事件目标。

$("#component-manager tr:not(.edit-component) td").on("click", function(event) { 
    if ($(event.target).index() !== 0) { 
     var checkbox = $(event.target).parent().find("input[name=component-selected]"); 
     checkbox.trigger("click"); 
    } 
}); 
相关问题