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

Javascript Function.prototype.bind詳細(xì)分析

 更新時(shí)間:2016年12月29日 10:51:34   投稿:lqh  
這篇文章主要介紹了Javascript Function.prototype.bind詳細(xì)分析的相關(guān)資料,需要的朋友可以參考下

  Function.prototype.bind分析

bind()方法會(huì)創(chuàng)建一個(gè)新的函數(shù),成為綁定函數(shù)。當(dāng)調(diào)用這個(gè)綁定函數(shù)時(shí),綁定函數(shù)會(huì)以創(chuàng)建它時(shí)傳入的第一個(gè)參數(shù)作為this,傳入bind()方法的第二個(gè)以及以后的參數(shù)加上綁定函數(shù)運(yùn)行時(shí)本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來(lái)調(diào)取原函數(shù)。

       實(shí)際使用中我們經(jīng)常會(huì)碰到這樣的問(wèn)題:

var name = "pig";
function Person(name){
  this.name = name;
  this.getName = function(){
    setTimeout(function(){
      console.log("Hello,my name is "+this.name);
    },100);
  }
}
var weiqi = new Person("衛(wèi)旗");
weiqi.getName();  
//Hello,my name is pig

       這個(gè)時(shí)候輸出this.name是pig,原因是this的指向是在運(yùn)行函數(shù)時(shí)確定的,而不是在定義函數(shù)時(shí)確定的,再因?yàn)閟etTimeout是在全局環(huán)境下只想,所以this就指向了window。

       以前解決這個(gè)問(wèn)題的辦法通常是緩存this,例如:

var name = "pig";
function Person(name){
  this.name = name;
  this.getName = function(){
    //在這里緩存一個(gè)this
    var self = this;
    setTimeout(function(){
      //在這里是有緩存this的self
      console.log("Hello,my name is "+self.name);
    },100);
  }
}
var weiqi = new Person("衛(wèi)旗");
weiqi.getName();
//Hello,my name is 衛(wèi)旗

       這樣就解決了這個(gè)問(wèn)題,非常方便,因?yàn)樗沟胹etTimeout函數(shù)中可以訪問(wèn)Person的上下文。

       現(xiàn)在有一個(gè)更好的解決辦法,可以使用bind()函數(shù),上面的例子可以被更新為:

var name = "pig";
function Person(name){
  this.name = name;
  this.getName = function(){
    setTimeout(function(){
      console.log("Hello,my name is "+this.name);
    }.bind(this),100);
    //注意上面這一行,添加了bind(this)
  }
}
var weiqi = new Person("衛(wèi)旗");
weiqi.getName();
//Hello,my name is 衛(wèi)旗

       bind()最簡(jiǎn)單的用法是創(chuàng)建一個(gè)函數(shù),使得這個(gè)函數(shù)無(wú)論怎么樣調(diào)用都擁有同樣的this值。JavaScript新手經(jīng)常犯的一個(gè)錯(cuò)誤就是將一個(gè)方法從一個(gè)對(duì)象中拿出來(lái),然后再調(diào)用,希望方法中的this是原來(lái)的對(duì)象(比如在回調(diào)函數(shù)中傳入這個(gè)方法)。如果不做特殊處理的話,一般會(huì)丟失原來(lái)的對(duì)象。從原來(lái)的函數(shù)和原來(lái)的對(duì)象創(chuàng)建一個(gè)綁定函數(shù),則可以很漂亮的解決這個(gè)問(wèn)題:

//定義全局變量x
var x = "window";
//在module內(nèi)部定義x
var module = {
  x:"module",
  getX:function(){
    console.log(this.x);
  }
}
module.getX(); 
//返回module,因?yàn)樵趍odule內(nèi)部調(diào)用getX()

var getX = module.getX;
getX();
//返回window,因?yàn)檫@個(gè)getX()是在全局作用域中調(diào)用的

//綁定getX()并將this值設(shè)為module
var boundGetX = getX.bind(module);
boundGetX();
//返回module,綁定以后this值始終為module

瀏覽器支持情況:

Browser Version support
Chrome 7
FireFox(Gecko) 4.0(2)
Internet Explorer 9
Opera 11.60
Safari 5.14

       很不幸,F(xiàn)unction.prototype.bind在IE8及以下版本中不被支持,所以如果沒(méi)有一個(gè)備選方案的話,可能會(huì)在運(yùn)行時(shí)出現(xiàn)問(wèn)題。bind函數(shù)在ECMA-262第五版才被加入。它可能不無(wú)法在所有瀏覽器上運(yùn)行。你可以在腳本部分加入如下代碼,讓不支持的瀏覽器也能使用bind()功能。

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

語(yǔ)法

    fun.bind(thisArg[, arg1[, arg2[, …]]])

參數(shù)

       thisArg,當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的this指向,當(dāng)使用new操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無(wú)效。

       arg1, arg2, …,當(dāng)綁定函數(shù)被調(diào)用時(shí),這些參數(shù)加上綁定函數(shù)本身的參數(shù)會(huì)按照順序作為原函數(shù)運(yùn)行時(shí)的參數(shù)。

描述

       bind()函數(shù)會(huì)創(chuàng)建一個(gè)新的函數(shù)(一個(gè)綁定的函數(shù))有同樣的函數(shù)體(在ECMAScript 5 規(guī)范內(nèi)置Call屬性),當(dāng)該函數(shù)(綁定函數(shù)的原函數(shù))被調(diào)用時(shí)this值綁定到bind()的第一個(gè)參數(shù),該參數(shù)不能被重寫。綁定函數(shù)被調(diào)用時(shí),bind()也接受預(yù)設(shè)的參數(shù)提供給原函數(shù)。一個(gè)綁定函數(shù)也能使用new操作符創(chuàng)建對(duì)象:這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。提供的this值被忽略,同事調(diào)用的參數(shù)被提供給模擬函數(shù)。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 關(guān)于ES6中的箭頭函數(shù)超詳細(xì)梳理

    關(guān)于ES6中的箭頭函數(shù)超詳細(xì)梳理

    箭頭函數(shù)可以說(shuō)是es6的一大亮點(diǎn),使用箭頭函數(shù),可以簡(jiǎn)化編碼過(guò)程,是代碼更加的簡(jiǎn)潔,下面這篇文章主要給大家介紹了關(guān)于ES6中箭頭函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • IE下雙擊checkbox反應(yīng)延遲問(wèn)題的解決方法

    IE下雙擊checkbox反應(yīng)延遲問(wèn)題的解決方法

    這篇文章主要介紹了IE下雙擊checkbox反應(yīng)延遲問(wèn)題的解決方法,需要的朋友可以參考下
    2014-03-03
  • 對(duì)于JavaScript繼承你到底了解多少

    對(duì)于JavaScript繼承你到底了解多少

    js的繼承機(jī)制不同于傳統(tǒng)的面向?qū)ο笳Z(yǔ)言,采用原型鏈實(shí)現(xiàn)繼承,基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法,下面這篇文章主要給大家介紹了關(guān)于JS繼承的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • js操作瀏覽器的參數(shù)方法

    js操作瀏覽器的參數(shù)方法

    下面小編就為大家?guī)?lái)一篇js操作瀏覽器的參數(shù)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 深入理解Javascript作用域與變量提升

    深入理解Javascript作用域與變量提升

    這篇文章主要是對(duì)Javascript作用域與變量提升進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • js中的閉包實(shí)例展示

    js中的閉包實(shí)例展示

    閉包是js中的一大特色,也是一大難點(diǎn)。下面這篇文章主要給大家介紹了關(guān)于js中閉包的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-11-11
  • JavaScript代碼實(shí)現(xiàn)左右上下自動(dòng)晃動(dòng)自動(dòng)移動(dòng)

    JavaScript代碼實(shí)現(xiàn)左右上下自動(dòng)晃動(dòng)自動(dòng)移動(dòng)

    最近幾天做了一個(gè)項(xiàng)目,原來(lái)是用css3動(dòng)畫做的,由于不兼容IE,改成用js做了,特此分享給大家,供大家參考
    2016-04-04
  • 小程序websocket心跳庫(kù)(websocket-heartbeat-miniprogram)

    小程序websocket心跳庫(kù)(websocket-heartbeat-miniprogram)

    這篇文章主要介紹了小程序websocket心跳庫(kù)(websocket-heartbeat-miniprogram),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 微信小程序自定義底部導(dǎo)航欄組件

    微信小程序自定義底部導(dǎo)航欄組件

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義底部導(dǎo)航欄組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 使用JavaScript遍歷輸出頁(yè)面中的所有元素的方法詳解

    使用JavaScript遍歷輸出頁(yè)面中的所有元素的方法詳解

    在前端開(kāi)發(fā)中,遍歷頁(yè)面中的所有元素是一個(gè)常見(jiàn)需求,無(wú)論是調(diào)試、頁(yè)面分析,還是獲取元素信息,都會(huì)用到遍歷 DOM 樹(shù)的操作,本文將介紹如何通過(guò) JavaScript 編寫一個(gè)方法,遍歷并輸出頁(yè)面中的所有元素,需要的朋友可以參考下
    2024-12-12

最新評(píng)論

太和县| 昌都县| 子长县| 桐梓县| 运城市| 岐山县| 威远县| 北海市| 皋兰县| 杭锦旗| 汾西县| 大关县| 贵定县| 文登市| 和田县| 彰化市| 苍山县| 阿拉善左旗| 石林| 佛山市| 湘阴县| 清水河县| 垣曲县| 文登市| 札达县| 临泉县| 北流市| 裕民县| 朝阳县| 永春县| 宁乡县| 九龙县| 华阴市| 高雄县| 霸州市| 牡丹江市| 思南县| 收藏| 黑山县| 竹溪县| 荥阳市|