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
- 手寫JS函式的call、apply、bindJS函式APP
- react之bind函式到元件通識篇React函式元件
- 面試常見問題之實現bind函式面試函式
- JS之回撥函式(callback)JS函式
- 理解Underscore中的_.bind函式函式
- bind函式polyfill原始碼解析函式原始碼
- bind 函式的實現原理函式
- 隨便寫
- 不要隨便開啟Office文件,微軟又有高危0day漏洞微軟
- JS專題之去抖函式JS函式
- JS專題之節流函式JS函式
- 手寫一個bind函式(大概)函式
- feign jar 提供的介面不要隨便刪除了,對呼叫方有影響JAR
- (譯) 函式式 JS #2: 函式!函式JS
- Oracle 隨機函式Oracle隨機函式
- JS專題之函式柯里化JS函式
- JS 總結之函式、作用域鏈JS函式
- JavaScirpt 的 bind 函式究竟做了哪些事Java函式
- react裡面bind與箭頭函式React函式
- C++11 標準庫 bind 函式C++函式
- 隨便聊聊 Java 8 的函數語言程式設計Java函數程式設計
- js深入之實現call、apply和bindJSAPP
- 兩個JS之間的函式互相呼叫JS函式
- js 常用函式JS函式
- js中windows的函式(隨機數,計時器的實現)JSWindows函式隨機
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- 不要隨便給玩家獎勵! 適得其反的獎勵是一種懲罰
- Java學習隨筆(函式式介面)Java函式
- JavaScript—call, apply, bind 函式能幹啥?(全)(20)JavaScriptAPP函式
- 手寫系列:call、apply、bind、函式柯里化APP函式
- 隨便聊聊前端專案前端
- JS函式節流和函式防抖JS函式
- JS高階函式-函式柯里化JS函式
- 26.JS函式JS函式
- Js常用的函式JS函式
- js函式,arguments物件JS函式物件
- Node.js 函式Node.js函式