使用“this”将函数作为参数传递的更好方法

时间:2014-07-29 17:55:00

标签: javascript jquery

在将函数作为使用this的参数传递时,我有一个非常简单的问题:什么是更好的(或者至少是正确的)。

更好的解释方法是举例:

假设我想fadeOut一个对象,然后将其从DOM中删除。所以我会这样做:

$("ul li.active").fadeOut(function() {
    $(this).remove();
});

或者我应该这样做?它是否正确? (它有效但可能是一种不好的做法)

$("ul li.active").fadeOut($(this).remove);

在任何问题上我都没有发现任何相关内容,所以我想知道。

1 个答案:

答案 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代码中这种情况稍微不那么常见。

在我的博客上更多关于此(呃,没有双关语):