乞丐版

基本原理使用apply模拟bind,函数体内的this就是原函数,使用apply进行参数content绑定、将参数第一个以外的作为提供给原函数的预设参数。

Function.prototype.bind=function(content){
  var me=this
  var arrayList=Array.prototype.slice.call(arguments)
  return funtion(){
    return me.apply(content,arrayList.slice(1))
  }
}

升级版

在返回的绑定函数中实现预设参数

Function.prototype.bind=function(content){
  if(typeof this!=='function'){
    throw new TypeError('this is no function')
 }
  var me=this
   var args=Array.prototype.slice.call(arguments,1)
   return function(){
     var interArgs==Array.prototype.slice.call(arguments)
     args=args.concat(interArgs)
     return me.apply(content,args)
   }
}

plus版

继续探究中,在bind方法中,bind返回的函数如果作为构造函数搭配new关键字出现,则绑定的this需要被忽略,this要绑定在实例上。也就是说new关键字的优先级高于bind绑定。兼容这种情况下实现如下

Function.prototype.bind=function(content){
  if(typeof this!=='function'){
    throw new TypeError('this is no function')
  }
  var me=this
  var args=Array.prototype.slice.call(arguments,1)
  var F=function(){}
  F.prototype=this.prototype
  var bound=function(){
    var interArgs=Array.prototype.slice.call(arguments)
    args=args.concat(interArgs)
    return me.apply(this instanceof F?this:content,args)
  }
  bound.prototype=new F()
  return bound
}