1

我曾经有过这样的电话:

var link = $('<a />', { 'class': 'prop' + index, title: elt, text: elt });
link.on('click', switchLabel);

如下switchLabel

function switchLabel(e) {
    $('#' + this.className.replace('prop','corr')).text(this.title);
}

我刚刚意识到this很难理解它在 javascript 中指的是什么,所以我替换为:

function switchLabel(e) {
    var source = e.currentTarget;
    $('#' + source.className.replace('prop','corr')).text(source.title);
}

我对么?请为您的答案添加一些解释,我们(js noobs)可以学习。

4

4 回答 4

7

this将其描述为“非常模棱两可”是不正确的。特别是,jQuery 保证this将引用处理程序中的“正确”元素。

现在,“正确”的含义可能会根据处理程序的建立方式而有所不同,但它总是有意义的。例如,当直接分配处理程序时,如在您的.on()调用中,则this处理程序中的值将是该原始选择中的元素(或元素之一,取决于所采取的实际操作)。在委托的情况下.on(), thenthis将再次是匹配选择器的元素。

也就是说,有时检查e.target是有意义的或确实有必要的;这样做并没有什么特别的错误,但是因为周围的迷信而这样做this有点愚蠢。

于 2013-05-22T14:49:01.280 回答
4

this并不是真的模棱两可,你只需要了解范围/闭包。尽管如此,如果switchLabel是一个通用函数,你不应该使用this它,如果它现在和永远只用作一个(jQuery)事件的回调/处理程序,你可以依赖this

于 2013-05-22T14:49:50.113 回答
1

e.currentTarget并且this在您的使用中不会比另一种更差。它们都无需查找即可出现,并且在大多数情况下它们都具有相同的值。但是,在某些情况下,其中e.currentTarget将不存在。

this顺便说一句,这并不模棱两可。这完全是范围问题,jQuery 做得很好。当您this在 jQuery 回调中使用时,可以保证this它将是您正在操作的当前元素/结构。没有歧义。

于 2013-05-22T14:50:50.580 回答
0

如果将处理程序与 JQuery 绑定,this将始终引用事件被调用者。

不要使用类进行操作,请尝试以下操作:

var link = $('<a />', { 'class': 'prop' + index, 'ind':index, title: elt, text: elt });
link.on('click', switchLabel);

function switchLabel(e) {
    $('#corr'+$(this).attr("ind")).text($(this).attr("title"));
}
于 2013-05-22T14:54:48.860 回答