title: Are function-arguments not necessarily objects?
body: <p>I'm learning functional programming and node.js, and I came across this odd problem when using <code>Function.prototype.apply</code> and <code>.bind</code>.  </p>
  
  <pre><code>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
  </code></pre>
  
  <p>This code works, it successfully spies on <code>target.method</code>. </p>
  
  <hr>
  
  <pre><code>//same code here
      target[method] = function (args){//args specified
          obj.count++
          original.apply(this, args)//and passed here
      }
  //same code here
  </code></pre>
  
  <p>This code, however, does not. It gives an error message: <code>TypeError: CreateListFromArrayLike called on non-object</code>.</p>
  
  <hr>
  
  <p>And then the biggest surprise is, this method works perfectly fine. </p>
  
  <pre><code>//same code here
      target[method] = function (args){
          obj.count++
          original.bind(this, args)
      }
  //same code here
  </code></pre>
  
  <p>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?</p>