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

<optgroup id="cczp1"><ruby id="cczp1"><cite id="cczp1"></cite></ruby></optgroup>
  • <acronym id="cczp1"></acronym>
    <acronym id="cczp1"><option id="cczp1"><ol id="cczp1"></ol></option></acronym>
    <delect id="cczp1"></delect>
    <center id="cczp1"></center>
    <delect id="cczp1"></delect><em id="cczp1"><button id="cczp1"><blockquote id="cczp1"></blockquote></button></em>
    1. <optgroup id="cczp1"><td id="cczp1"><dfn id="cczp1"></dfn></td></optgroup>

      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 屬性,當我用 sayGreeting 調(diào)用它時,它是運行在 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è)務中哪里需要使用 bind?

      上面的所有例子,數(shù)據(jù)的獲取和方法的調(diào)用都在一個對象上 bind 的作用并不明顯??捎袝r候當你需要向一個對象借一個方法但運行上下文需要在另一個對象中時,你就需要使用 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 對象借用它然后運行在 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

      當沒有其余參數(shù)時 apply 和 call 沒有區(qū)別,但是當我們有其余參數(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 中使用擴展運算符傳遞多個參數(shù)也很容易了。

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

      相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        2022年11月23日

      聯(lián)系我們

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