var foo={ value:1 } function bar(a){ console.log(a) console.log(this.value) return a; } Function.prototype.apply2 =function(context,arr){ var context = context||window,result; context.fn = this; if(!arr){ result = context.fn(); }else{ var args = [] for(var i = 0;i< arr.length;i++){ args.push('arr['+i+']'); } result = eval('context.fn('+args+")") } delete context.fn; return result; } bar.apply2(foo,[4,4,5])