在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(); });
答案 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()