模擬實現相容低版本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原型一章節。
相關文章
- javascript相容低版本IE瀏覽器的事件物件JavaScript瀏覽器事件物件
- 相容低版本IE瀏覽器的DOMContentLoaded事件瀏覽器事件
- 相容低版本IE瀏覽器的Object.create()方法瀏覽器Object
- 網頁變灰相容IE低版本瀏覽器網頁瀏覽器
- js實現的通用相容低版本IE瀏覽器的事件註冊和刪除JS瀏覽器事件
- IE瀏覽器相容瀏覽器
- 相容低版本IE瀏覽器的背景顏色漸變效果瀏覽器
- 相容低版本IE瀏覽器的阻止事件冒泡效果程式碼瀏覽器事件
- element ui 相容低版本瀏覽器UI瀏覽器
- 相容低版本IE瀏覽器的一些心得體會(持續更新)瀏覽器
- ie瀏覽器相容模式怎麼設定在哪裡 ie瀏覽器相容模式設定方法瀏覽器模式
- 絕對不能在低版本IE瀏覽器相容性問題上妥協瀏覽器
- 相容IE瀏覽器實現的中文兩端對齊程式碼例項瀏覽器
- 準確獲取低版本IE瀏覽器的版本號瀏覽器
- IE瀏覽器低版本判斷及升級提示瀏覽器
- JS模擬瀏覽器全域性搜尋功能實現JS瀏覽器
- IE瀏覽器下常見的CSS相容問題瀏覽器CSS
- 讓IE低版本瀏覽器也支援placeholder屬性瀏覽器
- 阻止瀏覽器冒泡事件,相容firefox和ie瀏覽器事件Firefox
- Bsie:讓 Bootsrap 相容 IE6-8 瀏覽器boot瀏覽器
- 如何在低版本IE瀏覽器中實現判斷img圖片載入完畢瀏覽器
- IE瀏覽器 自定義地址協議的實現瀏覽器協議
- 相容IE8和IE7瀏覽器的圓形圖案瀏覽器
- 對 IE6 ~ IE8 老瀏覽器相容的 intern-geezer瀏覽器
- Chrome 瀏覽器修改 UA 模擬其它瀏覽器,包括移動瀏覽器Chrome瀏覽器
- 瀏覽器元素全屏api和在ie核心的部分相容瀏覽器API
- 建立相容IE6瀏覽器的ajax請求物件瀏覽器物件
- JavaScript深入之bind的模擬實現JavaScript
- JavaScript 深入之bind的模擬實現JavaScript
- 原生js如何建立相容所有瀏覽器的xmlhttp物件JS瀏覽器XMLHTTP物件
- IE低版本瀏覽器document.referrer丟失解決方案瀏覽器
- Mac上如何測試IE瀏覽器相容性-虛擬機器解決方案Mac瀏覽器虛擬機
- Playwright 模擬微信瀏覽器瀏覽器
- Ionic4相容IE瀏覽器處理瀏覽器
- 模擬實現apply/call/bindAPP
- bind,call,apply模擬實現APP
- microsoft edge是ie瀏覽器嗎 edge瀏覽器和ie瀏覽器一樣嗎ROS瀏覽器
- 瀏覽器相容IE6、IE7、IE8、Firefox、OperaCSShack區分瀏覽器FirefoxCSS