Created
September 20, 2013 17:33
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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