bind() | Underscore JS 日本語リファレンス

第2引数をthisとした第1引数「関数」を返す。

■使用例

var func = function(greeting){
    return greeting + " : " + this.name;
};
var obj = { name : "moe" };
var txt = "hi";
var re = _.bind( func, obj );

// re = "hi : moe";
re( txt );

■内部構造

  _.bind = function(func, context) {
// Undescore JS 内で nativeBind = FuncProto.bind が宣言されている。
// nativeBind が宣言されていて第1引数が nativeBind を継承している時,
// func.bind( slice.call(arguments, 1) ); が返される。
    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
// 第1引数「func」が関数じゃない時、エラーが投げられる。
    if (!_.isFunction(func)) throw new TypeError("Bind must be called on a function");

// 第3引数以降のarguments 
    var args = slice.call(arguments, 2);
    var bound = function() {

// 第1引数の関数が nativeBind を継承していない時はexecuteBound()に代入され返される。
// this = _;
// args.concat( slice.call(arguments) ) は args の配列に arguments の配列を継ぎ足す。
// arguments は配列ではないので Array.concat() だと arguments object のまま継ぎ足される。

// CMS tools のバグのため書き方変えています。
      var args2 = func;
      var args3 = bound;
      var args4 = context;
      var args5 = this;
      var args6 = args.concat(slice.call(arguments));
      
      return executeBound( args2〜6 );
    };
    return bound;
  };

このページのトップへ戻る
Menu