<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                我們知道this綁定規則一共有5種情況: * 1、默認綁定(嚴格/非嚴格模式) * 2、隱式綁定 * 3、顯式綁定 * 4、new綁定 * 5、箭頭函數綁定 其實大部分情況下可以用一句話來概括,**this總是指向調用該函數的對象**。 但是對于箭頭函數并不是這樣,是根據外層(函數或者全局)作用域(**詞法作用域**)來決定this。 對于箭頭函數的this總結如下: 1. 箭頭函數不綁定this,箭頭函數中的this相當于普通變量。 2. 箭頭函數的this尋值行為與普通變量相同,在作用域中逐級尋找。 3. 箭頭函數的this無法通過bind,call,apply來**直接**修改(可以間接修改)。 4. 改變作用域中this的指向可以改變箭頭函數的this。 5. eg.`function closure(){()=>{//code }}`,在此例中,我們通過改變封包環境`closure.bind(another)()`,來改變箭頭函數this的指向。 ## 題目1 ``` ~~~ /** * 非嚴格模式 */ var name = 'window' var person1 = { name: 'person1', show1: function () { console.log(this.name) }, show2: () => console.log(this.name), show3: function () { return function () { console.log(this.name) } }, show4: function () { return () => console.log(this.name) } } var person2 = { name: 'person2' } person1.show1() // person1,隱式綁定,this指向調用者 person1 person1.show1.call(person2) // person2,顯式綁定,this指向 person2 person1.show2() // window,箭頭函數綁定,this指向外層作用域,即全局作用域 person1.show2.call(person2) // window,箭頭函數綁定,this指向外層作用域,即全局作用域 person1.show3()() // window,默認綁定,這是一個高階函數,調用者是window // 類似于`var func = person1.show3()` 執行`func()` person1.show3().call(person2) // person2,顯式綁定,this指向 person2 person1.show3.call(person2)() // window,默認綁定,調用者是window person1.show4()() // person1,箭頭函數綁定,this指向外層作用域,即person1函數作用域 person1.show4().call(person2) // person1,箭頭函數綁定, // this指向外層作用域,即person1函數作用域 person1.show4.call(person2)() // person2 ~~~ ``` 最后一個`person1.show4.call(person2)()`有點復雜,我們來一層一層的剝開。 * 1、首先是`var func1 = person1.show4.call(person2)`,這是顯式綁定,調用者是`person2`,`show4`函數指向的是`person2`。 * 2、然后是`func1()`,箭頭函數綁定,this指向外層作用域,即`person2`函數作用域 首先要說明的是,箭頭函數綁定中,this指向外層作用域,并不一定是第一層,也不一定是第二層。 因為沒有自身的this,所以只能根據作用域鏈往上層查找,直到找到一個綁定了this的函數作用域,并指向調用該普通函數的對象。 ## 題目2 這次通過構造函數來創建一個對象,并執行相同的4個show方法。 ~~~ /** * 非嚴格模式 */ var name = 'window' function Person (name) { this.name = name; this.show1 = function () { console.log(this.name) } this.show2 = () => console.log(this.name) this.show3 = function () { return function () { console.log(this.name) } } this.show4 = function () { return () => console.log(this.name) } } var personA = new Person('personA') var personB = new Person('personB') personA.show1() // personA,隱式綁定,調用者是 personA personA.show1.call(personB) // personB,顯式綁定,調用者是 personB personA.show2() // personA,首先personA是new綁定,產生了新的構造函數作用域, // 然后是箭頭函數綁定,this指向外層作用域,即personA函數作用域 personA.show2.call(personB) // personA,同上 personA.show3()() // window,默認綁定,調用者是window personA.show3().call(personB) // personB,顯式綁定,調用者是personB personA.show3.call(personB)() // window,默認綁定,調用者是window personA.show4()() // personA,箭頭函數綁定,this指向外層作用域,即personA函數作用域 personA.show4().call(personB) // personA,箭頭函數綁定,call并沒有改變外層作用域, // this指向外層作用域,即personA函數作用域 personA.show4.call(personB)() // personB,解析同題目1,最后是箭頭函數綁定, // this指向外層作用域,即改變后的person2函數作用域 ~~~ 題目一和題目二的區別在于題目二使用了new操作符。 > 使用 new 操作符調用構造函數,實際上會經歷一下4個步驟: > > 1. 創建一個新對象; > 2. 將構造函數的作用域賦給新對象(因此this就指向了這個新對象); > 3. 執行構造函數中的代碼(為這個新對象添加屬性); > 4. 返回新對象。 ## 參考 [ JavaScript深入之重新認識箭頭函數的this](https://muyiy.vip/blog/3/3.2.html#%E9%A2%98%E7%9B%AE1)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看