模擬實現相容低版本IE瀏覽器的原生bind()
關於javascript的bind()基本功能可以參閱javascript bind()一章節。
但是此函式是在IE8和IE8以下瀏覽器中並不支援,下面就介紹一下如何模擬實現此功能。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼if(!Function.prototype.bind){ Function.prototype.bind=function(oThis){ if (typeof this !== 'function'){ throw new TypeError('呼叫者不是當前函式物件'); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function() {}, fBound = function() { return fToBind.apply(this instanceof fNOP && oThis ? this : oThis||window, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; }
上面的程式碼實現了相容效果,下面介紹一下它的實現過程。
一.程式碼註釋:
1.if(!Function.prototype.bind),判斷當前瀏覽器是否支援bind()函式。
2.Function.prototype.bind=function(oThis){},如果不支援的話,就新增一個bind函式,引數自然是this要指向的物件。
3.if (typeof this !== 'function'){
throw new TypeError('呼叫者不是當前函式物件');
},因為使用call或者apply等方式的存在,可以將呼叫者轉換成其他物件,比如func.bind.call(obj),就是為了防止此情況的出現。
4.var aArgs = Array.prototype.slice.call(arguments, 1),獲取為bind函式傳遞的從第二個開始以後的引數。
5.fToBind = this,將當前函式物件的this引用賦值給變數fToBind 。
6.fNOP = function() {},使用表示式方式建立一個函式,它的用法在後面介紹。
7.fBound = function() {
return fToBind.apply(this instanceof fNOP && oThis ? this : oThis||window ,
aArgs.concat(Array.prototype.slice.call(arguments)));
},fBound函式就是要返回的函式。return fToBind.apply()前面加上return是因為fToBind函式可能會有返回值。
this instanceof fNOP && oThis ? this : oThis||window,this instanceof fNOP可以判斷是否用作建構函式,至於&&與運算子後面的oThis 是否需要值得商榷,如果按照MDN的原始碼的話,當用作建構函式不傳遞oThis引數的時候,那麼會用window物件呼叫fToBind函式,如果此位置沒有oThis,那麼無論是否bind()函式傳遞oThis引數,函式fBound用作建構函式的時候,都能夠使用this呼叫fToBind()函式。
aArgs.concat(Array.prototype.slice.call(arguments)),兩個陣列進行連線,最終結果就是要傳遞給fToBind()函式的引數。
8.fNOP.prototype = this.prototype,此句感覺完全沒有必要,可能是為了增加原型鏈的密度。
9.fBound.prototype = new fNOP(),將fBound的原型物件設定為fNOP()的例項物件,這樣的話如果fBound 用作建構函式的話,this instanceof fNOP返回值為true。
10.return fBound,返回此函式。
二.相關閱讀:
1.typeof運算子的用法參閱javascript typeof一章節。
2.slice()方法參閱javascript slice()一章節。
3.call()方法可以參閱javascript call()一章節。
4.concat()函式可以參閱js陣列 concat()一章節。
5.prototype原型可以參閱javascript prototype原型一章節。
相關文章
- IE瀏覽器相容瀏覽器
- element ui 相容低版本瀏覽器UI瀏覽器
- 相容低版本IE瀏覽器的一些心得體會(持續更新)瀏覽器
- ie瀏覽器相容模式怎麼設定在哪裡 ie瀏覽器相容模式設定方法瀏覽器模式
- 讓IE低版本瀏覽器也支援placeholder屬性瀏覽器
- IE瀏覽器低版本判斷及升級提示瀏覽器
- JS模擬瀏覽器全域性搜尋功能實現JS瀏覽器
- Ionic4相容IE瀏覽器處理瀏覽器
- microsoft edge是ie瀏覽器嗎 edge瀏覽器和ie瀏覽器一樣嗎ROS瀏覽器
- bind,call,apply模擬實現APP
- 模擬實現apply/call/bindAPP
- 前端檔案下載相容方案(相容主流瀏覽器,包括IE與Safari)前端瀏覽器
- Chrome 瀏覽器修改 UA 模擬其它瀏覽器,包括移動瀏覽器Chrome瀏覽器
- Playwright 模擬微信瀏覽器瀏覽器
- [BUG反饋]IE瀏覽器,百度瀏覽器,搜狗瀏覽器批量操作功能都不相容!!!!傲遊、火狐、谷歌瀏覽器可以瀏覽器谷歌
- ivew-admin 解決IE10+瀏覽器不相容IE10瀏覽器
- Directx遊戲中嵌入IE瀏覽器實現過程遊戲瀏覽器
- 9:瀏覽器相容瀏覽器
- bind/new/instanceof/assign模擬實現
- 聊一聊原生瀏覽器中的模組瀏覽器
- safari瀏覽器模擬ipone,ipad以及其他瀏覽器版本瀏覽器iPad
- js上傳圖片預覽,相容IE6以上各大主流瀏覽器JS瀏覽器
- IE瀏覽器版本的判斷瀏覽器
- ie瀏覽器怎麼升級 ie瀏覽器版本過低怎麼辦瀏覽器
- golang 模擬瀏覽器登入操作Golang瀏覽器
- JavaScript專題之模擬實現bindJavaScript
- ie瀏覽器開啟變成別的瀏覽器怎麼辦 開啟ie瀏覽器變成360怎麼改瀏覽器
- 瀏覽器相容性瀏覽器
- 關於瀏覽器相容瀏覽器
- forEach()相容所有瀏覽器瀏覽器
- js之call,apply和bind的模擬實現JSAPP
- 詳解 new/bind/apply/call 的模擬實現APP
- postTask:React的殺手鐗被瀏覽器原生實現了?React瀏覽器
- 原生Javascript實現BindJavaScript
- 模擬js中的call、apply和bind的實現JSAPP
- 怎麼調出ie瀏覽器_win10 ie瀏覽器怎麼調出來瀏覽器Win10
- JavaScript 判斷IE瀏覽器的版本包括IE11JavaScript瀏覽器IE11
- edge是什麼瀏覽器 microsoft edge是ie瀏覽器嗎瀏覽器ROS
- 微軟IE瀏覽器正式退役微軟瀏覽器