在将函数作为使用this
的参数传递时,我有一个非常简单的问题:什么是更好的(或者至少是正确的)。
更好的解释方法是举例:
假设我想fadeOut
一个对象,然后将其从DOM中删除。所以我会这样做:
$("ul li.active").fadeOut(function() {
$(this).remove();
});
或者我应该这样做?它是否正确? (它有效但可能是一种不好的做法)
$("ul li.active").fadeOut($(this).remove);
在任何问题上我都没有发现任何相关内容,所以我想知道。
答案 0 :(得分:4)
你的第二个例子没有工作(元素淡出,但是没有删除 - 回调不知道要删除哪个元素,因此不会删除)。它失败是因为remove
函数期望使用引用jQuery实例的this
来调用,当你以这种方式设置回调时,它会被this
调用,引用一个DOM元素代替。
在大多数jQuery回调的特定情况下,你的第一个表单是执行它的标准方法:
$("ul li.active").fadeOut(function() {
$(this).remove();
});
这是标准的原因是jQuery将this
的值设置为与事件相关的特定DOM元素。 (对于一些回调,它不是DOM元素,但这是通常的事情。)
当然,如果你需要做很多事情,你可能会有一个可以重复使用的命名函数:
function removeCallback() {
$(this).remove();
}
$("ul li.active").fadeOut(removeCallback);
// ...elsewhere...
$("some other selector").fadeOut(removeCallback);
在一般的情况下,与jQuery没有特别关系,如果你需要在特定对象上设置一个方法回调(那么,你想要控制在this
是什么)中,您可以使用ES5的Function#bind
来避免创建不必要的闭包。
doSomethingAndCallMeBack(this.method.bind(this));
在那里,我们使用this.method.bind(this)
创建一个函数,在调用时,将调用this.method
,确保方法中的this
与我们的代码中的含义相同。如果我们这样做:
doSomethingAndCallMeBack(this.method); // <== Can be wrong
...我们依靠doSomethingAndCallMeBack
来了解要使用的this
值(上面没有任何内容传递给它,告诉它,它必须已经知道)。
但是由于jQuery通常将this
设置为有用的值,所以在jQuery代码中这种情况稍微不那么常见。
在我的博客上更多关于此(呃,没有双关语):