0
if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

私は bind 関数のソースを見ていました。なぜ彼らが を実行しているのかを考えていましArray.prototype.slice.callarguments

4

1 に答える 1

2

argumentsは純粋な JavaScript 配列ではなく、配列のような objectであるためです。したがって、変更を加えるには、を使用して実際の配列に変換する必要がありますArray.prototype.slice.call

MDNから:

argumentsオブジェクトは配列ではありません。Array に似ていますが、 以外の Array プロパティはありませんlength

于 2013-03-15T12:19:25.077 に答える