摘要:其實(shí)它們都很簡(jiǎn)單,但是在處理一些與相關(guān)的函數(shù)的時(shí)候,用來(lái)改變函數(shù)中的指向,卻是必不可少的工具,所以必須掌握好它們的用法。
關(guān)于javascript中的bind、call、apply等函數(shù)的用法
? ? ? ? 前面的文章已經(jīng)說(shuō)到this的指向了,那么這篇文章就要說(shuō)一說(shuō)和this相關(guān)的三個(gè)函數(shù)的用法:bind( )、call( )和apply( )。
? ? ? ? 其實(shí)它們都很簡(jiǎn)單,但是在處理一些與this相關(guān)的函數(shù)的時(shí)候,用來(lái)改變函數(shù)中this的指向,卻是必不可少的工具,所以必須掌握好它們的用法。
? ? ? ? 好了,三管齊下,一起比較地舉例子說(shuō)一下:
//先來(lái)一個(gè)對(duì)象big吧 var big = { name:"BaBa", saying:function (age){ console.log(this.name,"age:",age); } }; //再來(lái)一個(gè)small對(duì)象 var small= { name:"ErZi" }; //如果想調(diào)用big的saying方法來(lái)說(shuō)出‘Erzi’: //使用bind方法 big.saying.bind(small)(20);//打印結(jié)果為ErZi age: 20 //使用call方法 big.saying.call(small,20);//打印結(jié)果為ErZi age: 20 //使用apply方法 big.saying.apply(small,[20]);//打印結(jié)果為ErZi age: 20
? ? ? ? 所以,其實(shí)三種方法都可以達(dá)到同一個(gè)結(jié)果,至于區(qū)別就很顯而易見(jiàn)了。
? ? ? ? bind只是單純將一個(gè)函數(shù)里的this的指向明確指定為small了,如果要執(zhí)行函數(shù),就要在后面加括號(hào)調(diào)用了。
? ? ? ? call就是直接執(zhí)行一個(gè)自己指定this指向的函數(shù),參數(shù)是一個(gè)一個(gè)傳遞。
? ? ? ? apply和call的區(qū)別就是,參數(shù)是放進(jìn)一個(gè)數(shù)組中傳遞。
? ? ? ? 實(shí)際上,很多時(shí)候我們?cè)谝粋€(gè)函數(shù)中,想用到其他的函數(shù),但是其他函數(shù)的this指向就不明確,所以就會(huì)在自己的函數(shù)里面通過(guò)這三個(gè)方法來(lái)調(diào)用函數(shù),例如:
//先來(lái)一個(gè)對(duì)象big吧 var big = { name:"BaBa", age:50, saying:function (){ console.log(this.name,"age:",this.age); } }; //再來(lái)一個(gè)SayingAge的構(gòu)造函數(shù) function SayingAge(name,age){ this.name = name; this.age = age; this.saying = big.saying.bind(this); } //實(shí)例化一個(gè)對(duì)象genius var genius = new SayingAge("tiancai",18); //調(diào)用genius的saying方法 genius.saying();//打印結(jié)果為tiancai age: 18
? ? ? ? 構(gòu)造函數(shù)SayingAge就是將big的saying方法拿過(guò)來(lái),并將saying函數(shù)里面的this指向改為自己的this指向(指向?qū)嵗膶?duì)象)。
? ? ? ? 如果想不單單是bind了一個(gè)函數(shù)的this指向,還想執(zhí)行它,舉個(gè)call的例子(apply只是將參數(shù)放進(jìn)數(shù)組):
//先來(lái)一個(gè)對(duì)象big吧 var big = { name:"BaBa", age:50, saying:function (sex){ console.log(this.name,"age:",this.age,"sex:",sex); } }; //再來(lái)一個(gè)small對(duì)象 var small = { name:"ErZi", age:18 }; //借用big的saying方法看看small的saying是什么 big.saying.call(small,"male");//打印結(jié)果為ErZi age: 18 sex: male
? ? ? ? 當(dāng)然了,這個(gè)方法并沒(méi)有給small添加了saying方法,只不過(guò)調(diào)用了big的saying方法,并將里面的this指向small而已。
? ? ? ? 相信大家對(duì)這三個(gè)方法的應(yīng)用都很輕松掌握了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91402.html
摘要:如果連續(xù)呢結(jié)果會(huì)是什么結(jié)果還是第一個(gè)原因是,在中,多次是無(wú)效的。更深層次的原因,的實(shí)現(xiàn),相當(dāng)于使用函數(shù)在內(nèi)部包了一個(gè),第二次相當(dāng)于再包住第一次故第二次以后的是無(wú)法生效的。 this 1.其實(shí)js中的this沒(méi)那么難理解,當(dāng)找不到this時(shí)記住一句話:誰(shuí)調(diào)我,我就指誰(shuí)!new 誰(shuí)指誰(shuí) function text1(){ console.log(this); //指wind...
摘要:系統(tǒng),扎實(shí)的語(yǔ)言基礎(chǔ)是一個(gè)優(yōu)秀的前端工程師必須具備的。第一個(gè)參數(shù)為調(diào)用函數(shù)時(shí)的指向,隨后的參數(shù)則作為函數(shù)的參數(shù)并調(diào)用,也就是。和的區(qū)別只有一個(gè),就是它只有兩個(gè)參數(shù),而且第二個(gè)參數(shù)為調(diào)用函數(shù)時(shí)的參數(shù)構(gòu)成的數(shù)組。 系統(tǒng),扎實(shí)的 javascript 語(yǔ)言基礎(chǔ)是一個(gè)優(yōu)秀的前端工程師必須具備的。在看了一些關(guān)于 call,apply,bind 的文章后,我還是打算寫下這篇總結(jié),原因其實(shí)有好幾個(gè)。...
摘要:新手經(jīng)常犯的一個(gè)錯(cuò)誤是將一個(gè)方法從對(duì)象中拿出來(lái),然后再調(diào)用,希望方法中的是原來(lái)的對(duì)象。如果不做特殊處理的話,一般會(huì)丟失原來(lái)的對(duì)象。 call、apply、bind是JavaScript中Function函數(shù)自帶的方法,主要用于改變this的指向 區(qū)別: call() 1.語(yǔ)法: fun.call(this, arg1,arg2) 2.this取值的幾點(diǎn)說(shuō)明: (1)處于非嚴(yán)格模式下,...
摘要:它們有明確的和成員函數(shù)的定義,只有的實(shí)例才能調(diào)用這個(gè)的成員函數(shù)。用和調(diào)用函數(shù)里用和來(lái)指定函數(shù)調(diào)用的,即指針的指向。同樣,對(duì)于一個(gè)后的函數(shù)使用或者,也無(wú)法改變它的執(zhí)行,原理和上面是一樣的。 函數(shù)里的this指針 要理解call,apply和bind,那得先知道JavaScript里的this指針。JavaScript里任何函數(shù)的執(zhí)行都有一個(gè)上下文(context),也就是JavaScri...
摘要:不能應(yīng)用下的等方法。首先我們可以通過(guò)給目標(biāo)函數(shù)指定作用域來(lái)簡(jiǎn)單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無(wú)效的。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...
閱讀 3363·2021-09-30 09:47
閱讀 2746·2021-08-18 10:22
閱讀 2532·2021-08-16 10:49
閱讀 2900·2019-08-30 15:53
閱讀 2741·2019-08-29 16:14
閱讀 3195·2019-08-28 18:18
閱讀 3242·2019-08-26 13:21
閱讀 799·2019-08-26 12:02