bind() 函數兼容

爲了搞清這個陌生又熟悉的bind,google一下,發現javascript1.8.5版本中原生實現了此方法,目前IE9+,ff4+,chrome7+支持此方法,opera和safari不支持(MDN上的說明)。 
bind的做用和apply,call相似都是改變函數的execute context,也就是 runtime 時 this 關鍵字的指向。可是使用方法略有不一樣。一個函數進行bind後可稍後執行。javascript

 bind 方法實現:綁定this  和 「科裏化」:java

function getConfig(colors,size,otherOptions){chrome

  console.log(colors,size,otherOptions)瀏覽器

}app

var defaultConfig = getConfig.bind(null,"#f00","1024*768");函數

defaultConfig("123");  //#f00 1024*768 123this

defaultConfig("345");  //#f00 1024*768 345google

由於bind 方法是EMS5 之後提出的方法,對於老的瀏覽器,可使用手寫一個bind 方法prototype

if(!Function.prototype.bind){ip

  Function.prototype.bind = function(oThis){

    if(typeOf this !== 'function'){

      throw new TypeError('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?this:oThis,

           aArgs.concat(Array.prototype.slice.call(arguments)))

      }

    fNOP.prototype = this.prototype;

    fBound.prototype = new fNOP();

    return fBound;

  }

}

相關文章
相關標籤/搜索