JS函式之不要隨便bind
JavaScript在ES5中加了個Function.prototype.bind
,可以繫結當前物件,於是就不需要再放一個變數來儲存this
了,在需要使用this
的情況下會很方便。
那麼Function.prototype.bind
到底是怎麼實現的呢?原生的實現先不說,Polyfill是我們可以看到的(參考),像這樣:
if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 internal IsCallable function throw new TypeError("Function.prototype.bind - 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 && oThis ? this : oThis || window, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; }
不難看出,我們得到的其實是一個全新的函式!原函式被封裝起來了,然後在呼叫的時候強制為它指定this
。
從結果上來看,瀏覽器原生的Function.prototype.bind
也是如此。
的fat arrow(=>
)實現的繫結比這個輕量一些,但也是需要將原函式和當前物件存起來,並返回一個新的函式:
func = (a) => doSomething(a)var func = (function(_this) { return function(a) { return doSomething(a); }; })(this);
那麼為什麼不要濫用呢?
我測試了一下瀏覽器原生的Function.prototype.bind
,發現使用了bind
之後,函式的記憶體佔用增加了近2倍!CoffeeScript實現的繫結稍微輕量一點,記憶體佔用也增加了1倍多。
再順便測試了下ES6新增的Arrow function(也是=>
),因為這個特殊函式是自帶繫結技能的,結果驚奇地發現,它的記憶體佔用和普通的Function
沒啥區別。所以以後需要或者不需要bind
的場景如果一定要濫用bind
圖個安心的話,可以通通上高逼格的箭頭函式。:)
作者:寂寞的原子
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2813094/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解JS函式之call,apply,bindJS函式APP
- 隨便寫倆Loadrunner函式函式
- js中call、apply、bind函式JSAPP函式
- 手寫JS函式的call、apply、bindJS函式APP
- react之bind函式到元件通識篇React函式元件
- 面試常見問題之實現bind函式面試函式
- 不要隨便開啟Office文件,微軟又有高危0day漏洞微軟
- 隨便寫
- awk之隨機函式rand()和srand()隨機函式
- bind函式polyfill原始碼解析函式原始碼
- 理解Underscore中的_.bind函式函式
- bind 函式的實現原理函式
- [譯]箭頭函式 vs .bind()函式
- oldwain隨便寫AI
- JS之回撥函式(callback)JS函式
- 使用bind()函式的產生的函式用作建構函式this的指向函式
- 手寫一個bind函式(大概)函式
- feign jar 提供的介面不要隨便刪除了,對呼叫方有影響JAR
- Oracle 隨機函式Oracle隨機函式
- JS專題之去抖函式JS函式
- JS專題之節流函式JS函式
- C++11 標準庫 bind 函式C++函式
- react裡面bind與箭頭函式React函式
- 隨便聊聊 Java 8 的函數語言程式設計Java函數程式設計
- (譯) 函式式 JS #2: 函式!函式JS
- (轉)Oracle隨機函式Oracle隨機函式
- bind( )介面卡(Adapter) -- 呼叫全域性函式及成員函式APT函式
- JS專題之函式柯里化JS函式
- JS 總結之函式、作用域鏈JS函式
- JavaScirpt 的 bind 函式究竟做了哪些事Java函式
- 隨便聊聊前端專案前端
- JS函式JS函式
- redis分散式鎖,面試官請隨便問,我都會Redis分散式面試
- to_char函式不要使用hh格式函式
- 學習bind原始碼,比較bind的方式繫結函式在在記憶體使用上優於箭頭函式原始碼函式記憶體
- Java學習隨筆(函式式介面)Java函式
- Js closure and bindJS
- Oracle取隨機數函式Oracle隨機函式