93 lines
2.2 KiB
JavaScript
93 lines
2.2 KiB
JavaScript
//
|
|
// This will generate a closure for the given function and optionally bind an arbitrary number of
|
|
// its initial arguments to specific values.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// 0: Either the function scope or the function.
|
|
// 1: If 0 is the function scope, this is the function.
|
|
// Otherwise it's the start of the optional bound argument list.
|
|
// 2: Start of the optional bound argument list if 1 is the function.
|
|
//
|
|
// Examples:
|
|
//
|
|
// function GlobalFunction(p0, p1, p2) { }
|
|
// function ThisFunction(p0, p1, p2) { }
|
|
//
|
|
// var a = Bind("GlobalFunction");
|
|
// var b = Bind(this, "ThisFunction");
|
|
// var c = Bind("GlobalFunction", BoundParam0, BoundParam1);
|
|
// var d = Bind(this, "ThisFunction", BoundParam0, BoundParam1);
|
|
// var e = Bind(GlobalFunction);
|
|
// var f = Bind(this, ThisFunction);
|
|
// var g = Bind(GlobalFunction, BoundParam0, BoundParam1);
|
|
// var h = Bind(this, ThisFunction, BoundParam0, BoundParam1);
|
|
//
|
|
// a(0, 1, 2);
|
|
// b(0, 1, 2);
|
|
// c(2);
|
|
// d(2);
|
|
// e(0, 1, 2);
|
|
// f(0, 1, 2);
|
|
// g(2);
|
|
// h(2);
|
|
//
|
|
function Bind()
|
|
{
|
|
// No closure to define?
|
|
if (arguments.length == 0)
|
|
return null;
|
|
|
|
// Figure out which of the 4 call types is being used to bind
|
|
// Locate scope, function and bound parameter start index
|
|
|
|
if (typeof(arguments[0]) == "string")
|
|
{
|
|
var scope = window;
|
|
var func = window[arguments[0]];
|
|
var start = 1;
|
|
}
|
|
|
|
else if (typeof(arguments[0]) == "function")
|
|
{
|
|
var scope = window;
|
|
var func = arguments[0];
|
|
var start = 1;
|
|
}
|
|
|
|
else if (typeof(arguments[1]) == "string")
|
|
{
|
|
var scope = arguments[0];
|
|
var func = scope[arguments[1]];
|
|
var start = 2;
|
|
}
|
|
|
|
else if (typeof(arguments[1]) == "function")
|
|
{
|
|
var scope = arguments[0];
|
|
var func = arguments[1];
|
|
var start = 2;
|
|
}
|
|
|
|
else
|
|
{
|
|
// unknown
|
|
console.log("Bind() ERROR: Unknown bind parameter configuration");
|
|
return;
|
|
}
|
|
|
|
// Convert the arguments list to an array
|
|
var arg_array = Array.prototype.slice.call(arguments, start);
|
|
start = arg_array.length;
|
|
|
|
return function()
|
|
{
|
|
// Concatenate incoming arguments
|
|
for (var i = 0; i < arguments.length; i++)
|
|
arg_array[start + i] = arguments[i];
|
|
|
|
// Call the function in the given scope with the new arguments
|
|
return func.apply(scope, arg_array);
|
|
}
|
|
}
|