爲了搞清這個陌生又熟悉的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;
}
}