(function(){ "use strict"; var it = [][Symbol.iterator](); while (it) { if (it.hasOwnProperty('next')) delete it.next; it = Object.getPrototypeOf(it); } var bind = Function.prototype.bind; var uncurryThis = bind.bind(bind.call); var bindFn = uncurryThis(bind); var applyFn = uncurryThis(bind.apply); function test() { print("here"); } var sliceFn = uncurryThis([].slice); function addAll(var_args) { var args = sliceFn(arguments, 0); var result = this; for (var i = 0; i < args.length; i++) result += args[i]; return result; } if (applyFn(addAll, 3, [4, 5, 6]) !== 18) throw "incorrect result"; })();