`
zhangyaochun
  • 浏览: 2562929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

underscore的Function之bind

 
阅读更多

 

   bind

 

   _.bind(function,context)

 

 

  • 给一个object绑定一个function,任何时候调用方法,this都指向这个object

 

  官方例子:

 

var func = function(greeting){
      return greeting + ":" + this.name;
}

func = _.bind(func,{name:"moe"},"hi");

func();   // "hi : moe"

 

 

   源码:

 

var ctor = function(){};

//ECMA 5支持的
var nativeBind = Function.prototype.bind,
    slice = Array.prototype.slice;


_.bind = function(func,context){

      var args,

            bound;

     //如果原生支持,就采用原生的bind
     if(func.bind === nativeBind && nativeBind){

            return nativeBind.apply(func,slice.call(arguments,1));

     }


     //对func的类型进行判断,非function就抛异常
     if(!_.isFunction(func)){
 
           throw new TypeError;
 
     }

     //第3个参数转换成数组
     args = slice.call(arguments,2);

     return bound = function(){

            //判断当前this是否是function的实例
            if(!(this instanceof bound)){

                   return func.apply(context,args,concat(slice.call(arguments)));
        
            }

            //保证this为func的实例
            ctor.prototype = func.prototype;
            var self = new ctor;

            ctor.prototype = null;

            var result = func.apply(self,args.concat(slice.call(arguments)));


            //判断result是不是Object
            if(Object(result) === result){
                     return result;
            }

            return self;

    };


};

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics