中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

淺析Javascript中bind()方法的使用與實現
來源:易賢網 閱讀:936 次 日期:2016-07-06 11:37:41
溫馨提示:易賢網小編為您整理了“淺析Javascript中bind()方法的使用與實現”,方便廣大網友查閱!

下面小編就為大家帶來一篇淺析Javascript中bind()方法的使用與實現。小編覺得挺不錯的,現在分享給大家,一起跟隨小編過來看看吧

在討論bind()方法之前我們先來看一道題目:

var altwrite = document.write;  

altwrite("hello");  

//1.以上代碼有什么問題

//2.正確操作是怎樣的

//3.bind()方法怎么實現

對于上面這道題目,答案并不是太難,主要考點就是this指向的問題,altwrite()函數改變this的指向global或window對象,導致執行時提示非法調用異常,正確的方案就是使用bind()方法:

altwrite.bind(document)("hello")  

當然也可以使用call()方法:

altwrite.call(document, "hello")  

本文的重點在于討論第三個問題bind()方法的實現,在開始討論bind()的實現之前,我們先來看看bind()方法的使用:

綁定函數

bind()最簡單的用法是創建一個函數,使這個函數不論怎么調用都有同樣的this值。常見的錯誤就像上面的例子一樣,將方法從對象中拿出來,然后調用,并且希望this指向原來的對象。如果不做特殊處理,一般會丟失原來的對象。使用bind()方法能夠很漂亮的解決這個問題:

this.num = 9; 

var mymodule = { 

 num: 81,

 getNum: function() { return this.num; }

};

module.getNum(); // 81

var getNum = module.getNum; 

getNum(); // 9, 因為在這個例子中,"this"指向全局對象

// 創建一個'this'綁定到module的函數

var boundGetNum = getNum.bind(module); 

boundGetNum(); // 81 

偏函數(Partial Functions)

Partial Functions也叫Partial Applications,這里截取一段關于偏函數的定義:

Partial application can be described as taking a function that accepts some number of arguments, binding values to one or more of those arguments, and returning a new function that only accepts the remaining, un-bound arguments.

這是一個很好的特性,使用bind()我們設定函數的預定義參數,然后調用的時候傳入其他參數即可:

function list() { 

 return Array.prototype.slice.call(arguments);

}

var list1 = list(1, 2, 3); // [1, 2, 3]

// 預定義參數37

var leadingThirtysevenList = list.bind(undefined, 37);

var list2 = leadingThirtysevenList(); // [37] 

var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3] 

和setTimeout一起使用

一般情況下setTimeout()的this指向window或global對象。當使用類的方法時需要this指向類實例,就可以使用bind()將this綁定到回調函數來管理實例。

function Bloomer() { 

 this.petalCount = Math.ceil(Math.random() * 12) + 1;

}

// 1秒后調用declare函數

Bloomer.prototype.bloom = function() { 

 window.setTimeout(this.declare.bind(this), 1000);

};

Bloomer.prototype.declare = function() { 

 console.log('我有 ' + this.petalCount + ' 朵花瓣!');

};

注意:對于事件處理函數和setInterval方法也可以使用上面的方法

綁定函數作為構造函數

綁定函數也適用于使用new操作符來構造目標函數的實例。當使用綁定函數來構造實例,注意:this會被忽略,但是傳入的參數仍然可用。

function Point(x, y) { 

 this.x = x;

 this.y = y;

}

Point.prototype.toString = function() { 

 return this.x + ',' + this.y; 

};

var p = new Point(1, 2); 

p.toString(); // '1,2'

var emptyObj = {}; 

var YAxisPoint = Point.bind(emptyObj, 0/*x*/); 

// 實現中的例子不支持,

// 原生bind支持:

var YAxisPoint = Point.bind(null, 0/*x*/);

var axisPoint = new YAxisPoint(5); 

axisPoint.toString(); // '0,5'

axisPoint instanceof Point; // true 

axisPoint instanceof YAxisPoint; // true 

new Point(17, 42) instanceof YAxisPoint; // true 

上面例子中Point和YAxisPoint共享原型,因此使用instanceof運算符判斷時為true。

捷徑

bind()也可以為需要特定this值的函數創造捷徑。

例如要將一個類數組對象轉換為真正的數組,可能的例子如下:

var slice = Array.prototype.slice;

// ...

slice.call(arguments);

如果使用bind()的話,情況變得更簡單:

var unboundSlice = Array.prototype.slice; 

var slice = Function.prototype.call.bind(unboundSlice);

// ...

slice(arguments); 

實現

上面的幾個小節可以看出bind()有很多的使用場景,但是bind()函數是在 ECMA-262 第五版才被加入;它可能無法在所有瀏覽器上運行。這就需要我們自己實現bind()函數了。

首先我們可以通過給目標函數指定作用域來簡單實現bind()方法:

Function.prototype.bind = function(context){ 

 self = this; //保存this,即調用bind方法的目標函數

 return function(){

   return self.apply(context,arguments);

 };

};

考慮到函數柯里化的情況,我們可以構建一個更加健壯的bind():

Function.prototype.bind = function(context){ 

 var args = Array.prototype.slice.call(arguments, 1),

 self = this;

 return function(){

   var innerArgs = Array.prototype.slice.call(arguments);

   var finalArgs = args.concat(innerArgs);

   return self.apply(context,finalArgs);

 };

};

這次的bind()方法可以綁定對象,也支持在綁定的時候傳參。

繼續,Javascript的函數還可以作為構造函數,那么綁定后的函數用這種方式調用時,情況就比較微妙了,需要涉及到原型鏈的傳遞:

Function.prototype.bind = function(context){ 

 var args = Array.prototype.slice(arguments, 1),

 F = function(){},

 self = this,

 bound = function(){

   var innerArgs = Array.prototype.slice.call(arguments);

   var finalArgs = args.concat(innerArgs);

   return self.apply((this instanceof F ? this : context), finalArgs);

 };

 F.prototype = self.prototype;

 bound.prototype = new F();

 return bound;

};

這是《JavaScript Web Application》一書中對bind()的實現:通過設置一個中轉構造函數F,使綁定后的函數與調用bind()的函數處于同一原型鏈上,用new操作符調用綁定后的函數,返回的對象也能正常使用instanceof,因此這是最嚴謹的bind()實現。

對于為了在瀏覽器中能支持bind()函數,只需要對上述函數稍微修改即可:

Function.prototype.bind = function (oThis) { 

  if (typeof this !== "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;

 };

以上這篇淺析Javascript中bind()方法的使用與實現就是小編分享給大家的全部內容了,希望能給大家一個參考

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲国产精品嫩草影院| 国产欧美精品在线播放| 欧美日韩综合不卡| 一本久久综合亚洲鲁鲁五月天 | 国产精品久久福利| 亚洲调教视频在线观看| 国产精品嫩草影院av蜜臀| 国产亚洲制服色| 久久免费国产精品1| 在线观看欧美日韩| 欧美日本国产视频| 亚洲男人的天堂在线| 国内成+人亚洲| 欧美大片国产精品| 亚洲午夜一区二区| 国产一区二区精品在线观看| 鲁鲁狠狠狠7777一区二区| 亚洲精品在线电影| 国产精品青草综合久久久久99| 久久se精品一区精品二区| 亚洲国产精品尤物yw在线观看| 欧美日韩国产页| 久久精品二区三区| 99视频日韩| 有码中文亚洲精品| 欧美偷拍一区二区| 免费不卡欧美自拍视频| 亚洲一区二区成人在线观看| 激情成人亚洲| 国产精品免费网站| 欧美jizz19hd性欧美| 毛片一区二区三区| 亚洲一区中文| 亚洲欧洲在线一区| 伊人久久婷婷| 国产视频综合在线| 欧美午夜精彩| 欧美激情一区二区久久久| 欧美在线国产精品| 一本色道久久88综合亚洲精品ⅰ | 中文精品视频一区二区在线观看| 国产日韩在线视频| 欧美日韩在线播| 欧美.www| 久久综合色影院| 久久成人羞羞网站| 午夜亚洲伦理| 亚洲一区二区四区| 一区二区三区高清| aa国产精品| 日韩小视频在线观看专区| 在线看欧美视频| 在线观看视频一区二区欧美日韩| 国产视频欧美视频| 国产欧美一区二区三区在线老狼 | 亚洲国产一成人久久精品| 国产日韩精品入口| 国产精品久久久久久一区二区三区 | 最近中文字幕日韩精品| 国产亚洲欧洲| 国产在线国偷精品产拍免费yy| 国产精品久久久久久久久免费樱桃| 欧美日韩 国产精品| 欧美日韩岛国| 欧美日韩一区二区在线观看| 欧美精品一区二区在线播放| 欧美日韩二区三区| 国产精品美女久久久浪潮软件| 国产精品人人做人人爽人人添| 国产精品草莓在线免费观看| 国产精品毛片高清在线完整版| 国产精品都在这里| 国产日本欧美一区二区| 国产精品影音先锋| 国产主播精品| 在线成人h网| 一区二区三区产品免费精品久久75 | 老司机一区二区三区| 久久久久久穴| 国产精品一区二区三区久久| 国产精品国产三级国产a| 国产精品大片免费观看| 国产美女扒开尿口久久久| 伊人激情综合| 一区二区精品| 久久午夜羞羞影院免费观看| 欧美国产另类| 国产目拍亚洲精品99久久精品| 一区二区三区在线观看国产| aⅴ色国产欧美| 久久精品国产久精国产一老狼| 欧美成人中文| 国产日韩一区| 一本色道久久| 久久综合精品国产一区二区三区| 欧美日韩视频在线观看一区二区三区 | 欧美日韩精品在线视频| 国产欧美一区二区白浆黑人| 亚洲国产成人porn| 亚洲免费视频中文字幕| 久久日韩精品| 国产精品hd| 在线观看视频一区二区| 一卡二卡3卡四卡高清精品视频| 玖玖国产精品视频| 国产亚洲成年网址在线观看| 黄色精品一区二区| 亚洲国产一区二区三区在线播| 正在播放日韩| 欧美一区国产二区| 久久综合导航| 欧美精品v国产精品v日韩精品| 欧美成人一区二区三区片免费| 国产精品乱人伦一区二区| 国产一区二区三区直播精品电影 | 久久精品国产一区二区三区免费看 | 国产精品视频男人的天堂| 国产亚洲欧美激情| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧美精品在线观看| 老司机午夜精品视频在线观看| 欧美日韩在线一区| 精品动漫av| 欧美一区二区免费观在线| 欧美成人一二三| 影音国产精品| 午夜欧美不卡精品aaaaa| 卡通动漫国产精品| 国产精品国产三级国产普通话三级| 国产一区二区在线观看免费| 亚洲激情视频网| 欧美在线视频不卡| 欧美午夜精品久久久久久久| 亚洲国产精品成人精品| 久久久www| 国产欧美日本一区二区三区| 欧美一区二区三区在线| 欧美日韩国产高清| 国内精品久久国产| 亚洲欧美日本另类| 欧美日韩国产三区| 亚洲少妇诱惑| 欧美日韩人人澡狠狠躁视频| 在线精品国产欧美| 欧美在线中文字幕| 国产精品久久久久久久久搜平片 | 亚洲激情午夜| 久久亚洲精品中文字幕冲田杏梨| 国产精品久久亚洲7777| 亚洲天堂偷拍| 欧美视频久久| 亚洲夜间福利| 国产精品另类一区| 亚洲自拍偷拍色片视频| 欧美极品在线视频| 亚洲国产小视频在线观看| 久久精品一级爱片| 欧美性大战久久久久久久蜜臀| 亚洲欧洲三级| 免费观看日韩av| 国内视频精品| 欧美91视频| 99re66热这里只有精品4| 欧美精品乱人伦久久久久久| 亚洲欧洲日韩在线| 欧美呦呦网站| 最新日韩欧美| 欧美激情亚洲自拍| 一区二区三区国产精华| 国产精品久久久久9999高清| 欧美日韩亚洲系列| 性18欧美另类| 合欧美一区二区三区| 男人天堂欧美日韩| 99精品久久久| 国产视频欧美| 免费日韩视频| 一本色道久久88亚洲综合88| 国产精品美女久久久久久久| 久久精品99国产精品日本| 国内精品久久久久伊人av| 欧美日韩国产经典色站一区二区三区| 一区二区三区色| 韩日精品在线| 欧美日韩亚洲视频| 久久久久欧美精品| 99亚洲一区二区| 国产日韩专区在线| 免费的成人av| 亚洲欧美国产毛片在线| 亚洲日韩中文字幕在线播放| 国产精品永久入口久久久| 久久女同精品一区二区| 99热这里只有成人精品国产| 欧美视频精品一区| 欧美激情视频免费观看| 亚洲欧美激情视频在线观看一区二区三区| 国产欧美日韩中文字幕在线| 欧美人成网站| 亚洲自拍偷拍麻豆|