国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

關于原生js中bind函數的簡單實現

2019-11-20 09:16:07
字體:
來源:轉載
供稿:網友

今天繼續研究了bind函數的實現,也知道了shim和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; };}

這是官方文檔上的實現,我分二個方面來談我要說的東西,

第一個是參數,agruments的使用

var aArgs = Array.prototype.slice.call(arguments, 1),這里是將bind函數的參數數組取出來,第一個參數不要(就是不要oThis)也就是要被綁定方法的那個對象,第二個是

aArgs.concat(Array.prototype.slice.call(arguments))); 這里是用了數組的方法,把參數插在參數數組后面,要注意,這個函數是要被return 出去然后執行的,他的參數數組是return出去的那個fBound函數的參數數組,所以上下兩個參數數組是不一樣的,有點像柯里化。

第二個是上下文,在其中上下文的變化比較難理解,bind函數主要就是為了綁定上下文來使用的

fToBind = this 這里是保存了對象的上下文,緊接著下面的apply方法讓要被綁定的那個對象可以使用該上下文

fNOP.prototype = this.prototype;

fBound.prototype = new fNOP();

這里是以fNOP為中介把this.prototype這個原對象的屬性給fBound,確保fBound是在定義的時候的那個上下文里面執行。本來

bound.prototype = self.prototype就可以將原屬性集成過來了,但是這樣兩個對象屬性都指向同一個地方,修改 bound.prototype 將會造成self.prototype 也發生改變,這樣并不是我們的本意。所以通過一個空函數 nop 做中轉,能有效的防止這種情況的發生。

以上這篇關于原生js中bind函數的簡單實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大冶市| 库车县| 眉山市| 永康市| 左贡县| 旬阳县| 佛坪县| 安化县| 合水县| 通州区| 大庆市| 云安县| 泽库县| 涪陵区| 稻城县| 瑞丽市| 太康县| 铜鼓县| 海盐县| 濉溪县| 乌兰察布市| 岑巩县| 乌鲁木齐县| 株洲市| 新沂市| 定边县| 井陉县| 澄迈县| 疏勒县| 文化| 彭泽县| 东乡族自治县| 克什克腾旗| 古蔺县| 巧家县| 丰都县| 东山县| 文水县| 江孜县| 喀喇沁旗| 南涧|