最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于原生js中bind函數(shù)的簡單實現(xiàn)

 更新時間:2016年08月10日 10:28:17   投稿:jingxian  
下面小編就為大家?guī)硪黄P(guān)于原生js中bind函數(shù)的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

今天繼續(xù)研究了bind函數(shù)的實現(xiàn),也知道了shim和polyfill的說法,現(xiàn)在總結(jié)一下,

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;
 };
}

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

第一個是參數(shù),agruments的使用

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

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

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

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

fNOP.prototype = this.prototype;

fBound.prototype = new fNOP();

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

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

以上這篇關(guān)于原生js中bind函數(shù)的簡單實現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

乌拉特中旗| 曲周县| 莫力| 南华县| 清丰县| 黔东| 湖北省| 中卫市| 浦江县| 密云县| 景德镇市| 永吉县| 洞头县| 平阴县| 郯城县| 四川省| 贞丰县| 南川市| 那坡县| 桂阳县| 亳州市| 江山市| 通辽市| 乌恰县| 克拉玛依市| 博罗县| 赤水市| 濉溪县| 桐乡市| 元氏县| 西乡县| 临沭县| 无极县| 惠东县| 滦平县| 常宁市| 云和县| 千阳县| 阳西县| 健康| 昌乐县|