Skip to content

Instantly share code, notes, and snippets.

@servel333
Created September 20, 2013 17:33
Show Gist options
  • Save servel333/6640998 to your computer and use it in GitHub Desktop.
Save servel333/6640998 to your computer and use it in GitHub Desktop.
A hacky alternative to function.apply and function.call in cases where those will not work.
(function(window, undefined) {
"use strict";
// @function func.apply( thisArg [, argsArray ] )
// @function func.call ( thisArg [, arg1 [, arg2 [, ...] ] ] )
var _applyIndirect = function(func, thisArg, argsArray) {
Function.prototype.apply.call(func, thisArg, argsArray);
};
var _applyDirect = function(func, argsArray) {
var a = Array.prototype.slice.call(argsArray);
switch (a.length) {
case 0: return func();
case 1: return func(a[0]);
case 2: return func(a[0],a[1]);
case 3: return func(a[0],a[1],a[2]);
case 4: return func(a[0],a[1],a[2],a[3]);
case 5: return func(a[0],a[1],a[2],a[3],a[4]);
case 6: return func(a[0],a[1],a[2],a[3],a[4],a[5]);
case 7: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
case 8: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
case 9: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
case 10: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
case 11: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10]);
case 12: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11]);
case 13: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12]);
case 14: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13]);
case 15: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14]);
case 16: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]);
case 17: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]);
case 18: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16],a[17]);
case 19: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16],a[17],a[18]);
case 20: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16],a[17],a[18],a[19]);
default: throw new Error('Unsuppoted number of arguments');
}
};
/// Simulate the call functionality but without using apply or call.
/// @remarks
/// Limited to functions with less then 20 arguments.
function.prototype.callDirect = function(/* arg, ... */) { _applyDirect(this, arguments); };
/// Simulate the apply functionality but without using apply or call.
/// @remarks
/// Limited to functions with less then 20 arguments.
function.prototype.applyDirect = function(args) { _applyDirect(this, args); };
})(window);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment