在JavaScript中,方法每每涉及到上下文,也就是this,所以每每不能直接引用,就拿最多見的console.log("info…")來講,避免書寫冗長的console,直接用log("info…")代替,不假思索的會想到以下語法:瀏覽器
1 var log = console.log; 2 log("info…");
很遺憾,運行報錯:TypeError: Illegal invocation。閉包
爲啥呢?對於console.log("info…")而言,log方法在console對象上調用,所以log方法中的this指向console對象;而咱們用log變量指向console.log方法,而後直接調用log方法,此時log方法的this指向的是window對象,上下文不一致,固然會報錯了。app
此時咱們能夠用bind方法解決這個問題。bind方法容許手動傳入一個this,做爲當前方法的上下文,而後返回持有上下文的方法,例如:this
1 var log = console.log.bind(console); 2 log("info...");
這樣就不會報錯了。spa
可是,bind方法並不支持ie 8以及更低版本的瀏覽器,咱們徹底能夠本身實現一個,很簡單。prototype
1 Function.prototype.bind = Function.prototype.bind || function(context){ 2 var _this = this; 3 4 return function(){ 5 _this.apply(context, arguments); 6 }; 7 };
核心經過apply方法實現,閉包的經典應用。_this指向當前方法,context指向當前方法的上下文,兩者均經過閉包訪問。code