I'm learning functional programming and node.js, and I came across this odd problem when using Function.prototype.apply and .bind.  
function Spy(target, method) {
    var obj = {count: 0};
    var original = target[method]
    target[method] = function (){//no specified arguments
        obj.count++
        original.apply(this, arguments)//only arguments property passed
    }
    return obj;
}
module.exports = Spy
This code works, it successfully spies on target.method. 
//same code here
    target[method] = function (args){//args specified
        obj.count++
        original.apply(this, args)//and passed here
    }
//same code here
This code, however, does not. It gives an error message: TypeError: CreateListFromArrayLike called on non-object.
And then the biggest surprise is, this method works perfectly fine.
//same code here
    target[method] = function (args){
        obj.count++
        original.bind(this, args)
    }
//same code here
So why exactly do I get this error? Is it because function arguments are not necessarily objects? Or is it because apply has a stricter description than bind?
 
     
     
    