Using Function.prototype.bind with an array of arguments?
Solution 1:
.bind
is a normal function, so you can call .apply
on it.
All you have to do is pass the original function as the first param and the desired THIS
variable as the first item in the array of arguments:
bound = db.find.bind.apply(db.find, [null].concat(arguments));
// ^-----^ ^-----^ THIS
Whether that can be considered cleaner or not is left to the reader.
Solution 2:
The following is a common snippet of code I use in all my projects:
var bind = Function.bind;
var call = Function.call;
var bindable = bind.bind(bind);
var callable = bindable(call);
The bindable
function can now be used to pass an array to bind
as follows:
var bound = bindable(db.find, db).apply(null, arguments);
In fact you can cache bindable(db.find, db)
to speed up the binding as follows:
var findable = bindable(db.find, db);
var bound = findable.apply(null, arguments);
You can use the findable
function with or without an array of arguments:
var bound = findable(1, 2, 3);
Hope this helps.
Solution 3:
Felix's answer didn't work for me because the arguments
object isn't really an array (as Otts pointed out). The solution for me was to simply switch bind
and apply
:
bound = db.find.apply.bind(db.find, null, arguments);