为什么JSHint警告我在回调函数中使用'this'?

时间:2014-02-16 21:49:38

标签: javascript jquery jshint

我使用的IDE(Cloud 9)通过在检测到错误时向我发出警告来合并JSHint。作为一个原则,我尝试纠正我的代码来纠正这些错误。我现在有一个我看不到的方法:

$("#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试图推广的)?

3 个答案:

答案 0 :(得分:3)

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

您可以在代码中插入一条注释,告诉jsHint忽略此特定用途。如果我找到它,我会去看看我是否能找到它并将其添加到我的答案中。您可以使用jsHint的validthis选项:http://www.jshint.com/docs/options/#validthis忽略特定功能的此警告。

我自己没有尝试过,但根据文档,您可以将其添加到函数中:

/* jshint validthis: true */

或者,配置文件可以与jshint一起使用,更改此选项的默认值(您必须弄清楚如何在IDE中执行此操作)。

答案 1 :(得分:1)

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

如果它极其烦扰,而这只会在您使用this时发生,您可以执行lordvlad所说的内容并使用function(e){并将$(this)替换为e.target。< / p>

答案 2 :(得分: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");
    }
});