亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                40 – 真正理解 Bind、Call 和 Apply

                40 – 真正理解 Bind、Call 和 Apply

                原文地址:https://dev.to/bhagatparwinder/truly-understand-bind-call-apply-21da

                Bind

                JavaScript 中的 this 扮演者重要的角色,在 JavaScript 中它是依據(jù)函數(shù)是怎么被調(diào)用的而不是它在哪聲明的(箭頭函數(shù)則表現(xiàn)為相反)。

                我們舉一個例子來示范一下 this 是如何工作的:

                const sayGreeting = { name: “Parwinder”, hello: function() { return `Hello, ${this.name}`; }}console.log(sayGreeting.hello()); // Hello, Parwinder

                hello 方法可以獲取 sayGreeting 上的 name 屬性,當(dāng)我用 sayGreeting 調(diào)用它時,它是運(yùn)行在 sayGreeting 對象上下文中的。

                相反如果我這樣做:

                const sayGreeting = { name: “Parwinder”, hello: function() { return `Hello, ${this.name}`; }}const hello = sayGreeting.hello;console.log(hello === sayGreeting.hello); // trueconsole.log(hello()); // Hello, undefined

                盡管 hello 變量與 sayGreeting 對象上的 hello 方法相等,但它的執(zhí)行上下文并不是在 sayGreeting 中,而是在 window 或全局狀態(tài)中。

                bind 方法允許我們綁定上下文,它返回一個新的方法且上下文綁定為我們傳遞給 bind 函數(shù)的內(nèi)容。

                const sayGreeting = { name: “Parwinder”, hello: function() { return `Hello, ${this.name}`; }}const hello = sayGreeting.hello.bind(sayGreeting);console.log(hello()); // Hello, Parwinder

                實際業(yè)務(wù)中哪里需要使用 bind?

                上面的所有例子,數(shù)據(jù)的獲取和方法的調(diào)用都在一個對象上 bind 的作用并不明顯??捎袝r候當(dāng)你需要向一個對象借一個方法但運(yùn)行上下文需要在另一個對象中時,你就需要使用 bind。

                const sayGreeting = { name: “Parwinder”, hello: function () { return `Hello, ${this.name}`; }}const nameObject = { name: “Lauren”}const hello = sayGreeting.hello.bind(nameObject);console.log(hello()); // Hello, Lauren

                sayGreeting 對象上有 hello 方法,所以在 nameObject 對象上就沒有必要再寫一個相同的方法。我可以向 sayGreeting 對象借用它然后運(yùn)行在 nameObject 上下文中

                Call

                call 和 apply 與 bind 是有區(qū)別的,bind 返回一個新的方法而 call 和 apply 則立即調(diào)用執(zhí)行方法。call 把 this 作為第一個參數(shù),其他參數(shù)需要一個個的傳遞。它們都會傳遞到我們調(diào)用的函數(shù)中:

                const sayGreeting = { name: “Parwinder”, hello: function () { return `Hello, ${this.name}`; }}console.log(sayGreeting.hello.call(sayGreeting)); // Hello, Parwinder

                帶有其它參數(shù):

                const sayGreeting = { name: “Parwinder”, hello: function (trait, color) { return `Hello, ${this.name}. I see you ${trait} ${color}. It is my favorite too!`; }}console.log(sayGreeting.hello.call(sayGreeting, “like”, “red”));// Hello, Parwinder. I see you like red. It is my favorite too!

                Apply

                盡管 apply 和 call 類似都是直接執(zhí)行函數(shù),但它接受的是一個數(shù)組作為第二個參數(shù)而不是逗號分隔的值。

                const sayGreeting = { name: “Parwinder”, hello: function () { return `Hello, ${this.name}`; }}console.log(sayGreeting.hello.apply(sayGreeting)); // Hello, Parwinder

                當(dāng)沒有其余參數(shù)時 apply 和 call 沒有區(qū)別,但是當(dāng)我們有其余參數(shù)時,使用方法就有點區(qū)別:

                const sayGreeting = { name: “Parwinder”, hello: function (trait, color) { return `Hello, ${this.name}. I see you ${trait} ${color}. It is my favorite too!`; }}console.log(sayGreeting.hello.apply(sayGreeting, [“like”, “red”]));// Hello, Parwinder. I see you like red. It is my favorite too!

                apply 使得傳遞多個參數(shù)變得更容易些,但是現(xiàn)在 ES6 中使用擴(kuò)展運(yùn)算符傳遞多個參數(shù)也很容易了。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月21日 06:41
                下一篇 2022年6月21日 06:42

                相關(guān)推薦

                • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

                  對于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營一個朋友圈,有的微商看起來逼格滿滿,實際效果也不錯;而有的卻動都不動就被屏蔽甚至拉黑…

                  2022年11月27日
                • 存儲過程語法(sql server存儲過程語法)

                  今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲過程基本語法…

                  2022年11月26日
                • 《寶可夢朱紫》夢特性怎么獲得?隱藏特性獲取方法推薦

                  寶可夢朱紫里有很多寶可夢都是擁有夢特性會變強(qiáng)的寶可夢,很多玩家不知道夢特性怎么獲得,下面就給大家?guī)韺毧蓧糁熳想[藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

                  2022年11月25日
                • 《寶可夢朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

                  寶可夢朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧糁熳掀骠斃虬策M(jìn)化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

                  2022年11月25日
                • 2023年擺地攤賣什么最賺錢而且很受歡迎(2022年擺地攤合法嗎)

                  關(guān)于擺地攤賺錢每年的熱度也是非常高的,很多想要做點小本生意的商家也都會選擇擺地攤這個項目,所需要的成本也是非常低的。那么,2023年擺地攤賣什么最賺錢而且很受歡迎?今天極客號小編整…

                  2022年11月25日
                • 密接5+3是什么意思(密接人員是什么意思)

                  如今新冠病例的傳播速度是越來越快了,對于感染了新冠病毒的人員來說都會采取隔離觀看措施。而據(jù)了解,當(dāng)前國內(nèi)又對新冠疫情防控政策做了新的調(diào)整優(yōu)化,其中密接管理調(diào)整為“5+3”。很多人對…

                  2022年11月25日
                • 不知道考研真題哪里找?看這里!

                  考研備考沖刺階段,知道大家都很疲憊,但是,別讓自己之前的努力白費,再堅持堅持,會看到你想要的結(jié)果的。 要是你想考研成功,有一個資料就必須要有。它就是:歷年考研真題。 考研真題的重要…

                  2022年11月25日
                • 銳龍97900x參數(shù)規(guī)格跑分評測 銳龍97900x屬于什么檔次

                  銳龍9 7900X是銳龍7000系列處理器中性能頂尖的型號之一,它采用了這一代標(biāo)配的zen4架構(gòu)和5nm制程工藝,那么它具體的參數(shù)跑分如何,在電腦上世紀(jì)發(fā)揮怎么樣呢,下面就來看看銳…

                  2022年11月24日
                • 《寶可夢朱紫》暴飛龍怎么抓?暴飛龍獲得方法

                  寶可夢朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實獲得方法很簡單,暴飛龍直接是沒得抓的,需要玩家從寶貝龍進(jìn)化得到,下面一起來看一下寶可夢朱紫暴飛龍獲得…

                  2022年11月23日
                • 《寶可夢朱紫》布土撥怎么進(jìn)化?布土撥進(jìn)化方法介紹

                  寶可夢朱紫中,不同的寶可夢有不同的進(jìn)化方法,其中布土撥的進(jìn)化方法是比較特殊的。很多玩家不知道寶可夢朱紫布土撥怎么進(jìn)化,下面就帶來寶可夢朱紫布土撥進(jìn)化方法介紹,一起來看看吧,希望能幫…

                  2022年11月23日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時間:周一至周五,10:30-18:30,節(jié)假日休息