如何在JavaScript中正確引用某個方法(bind方法的應用)

     在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

相關文章
相關標籤/搜索