如何将参数绑定到回调?

时间:2015-07-15 17:23:04

标签: javascript jquery

在C ++中,您有一个bind函数,允许您将参数绑定到函数。调用该函数时,将使用这些参数调用它。类似地,MySQL具有将参数绑定到查询的能力,其中它将用变量替换问号。在Javascript和jQuery中,bind函数具有容易混淆的含义。它使传递的参数成为this变量,这根本不是我想要的。这是我想要实现的一个例子:

    var outerVariable;
    var callbacks = [
        some_object.event,
        some_object.differentEvent.bind(outerVariable)
    ];
    // func() will automatically have outerVariable in scope
    $.map(callbacks, function(func) { func(); });

3 个答案:

答案 0 :(得分:2)

我不认为有一种简单的方法可以在不使用bind的情况下使用this,如果你想绑定参数,你可能更好地编写一个包装器

function bindArgs(fn) {
    var slice = Array.prototype.slice,
        bound_args = slice.call(arguments, 1);
    return function () {
        var args = slice.call(arguments, 0);
        return fn.apply(this, bound_args.concat(args));
    }
}

现在

function foo(a, b) {
    console.log(this, a, b);
}
var bar = bindArgs(foo, 'bar');
var obj = {baz: bar};
obj.baz('baz'); // logs obj, "bar", "baz"

答案 1 :(得分:1)

请改为:

var callbacks = [
    some_object.event,
    some_object.differentEvent.bind(some_object, outerVariable)
];

答案 2 :(得分:1)

C ++和JavaScript bind之间的唯一区别是JavaScript bind需要一个额外的参数:thisArg,它将为绑定函数绑定关键字this如果您不想重新绑定this - 参数,那么将null作为第一个参数传递,其余的应该看起来对您所说的C ++变体很熟悉:

function add(a, b) {
    return a + b
}

var three = add(1, 2)
var makeThree = add.bind(null, 1, 2)
three = makeThree()