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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 附錄C:詞法this 這本書通篇沒有講解?`this`?機制的任何細節,有一個 ES6 的話題以一種重要的方式將?`this`?與詞法作用域聯系了起來,我們將快速檢視它一下。 ES6 為函數聲明增加了一種特殊的語法形式,稱為“箭頭函數”。它看起來像這樣: ```source-js var foo = a => { console.log( a ); }; foo( 2 ); // 2 ``` 這個所謂的“大箭頭”經常被稱為是?*乏味煩冗的*(諷刺)`function`?關鍵字的縮寫。 但是在箭頭函數上發生的一些事情要重要得多,而且這與在你的聲明中少敲幾下鍵盤無關。 簡單地說,這段代碼有一個問題: ```source-js var obj = { id: "awesome", cool: function coolFn() { console.log( this.id ); } }; var id = "not awesome"; obj.cool(); // awesome setTimeout( obj.cool, 100 ); // not awesome ``` 這個問題就是在?`cool()`?函數上丟失了?`this`?綁定。有各種方法可以解決這個問題,但一個經常被重復的解決方案是?`var self = this;`。 它可能看起來像: ```source-js var obj = { count: 0, cool: function coolFn() { var self = this; if (self.count < 1) { setTimeout( function timer(){ self.count++; console.log( "awesome?" ); }, 100 ); } } }; obj.cool(); // awesome? ``` 用不過于深入細節的方式講,`var self = this`?的“解決方案”免除了理解和正確使用?`this`?綁定的整個問題,而是退回到我們也許感到更舒服的東西上面:詞法作用域。`self`?變成了一個可以通過詞法作用域和閉包解析的標識符,而且一直不關心?`this`?綁定發生了什么。 人們不喜歡寫繁冗的東西,特別是當他們一次又一次重復它的時候。于是,ES6 的一個動機是幫助緩和這些場景,將常見的慣用法問題?*固定*?下來,就像這一個。 ES6 的解決方案,箭頭函數,引入了一種稱為“詞法 this”的行為。 ```source-js var obj = { count: 0, cool: function coolFn() { if (this.count < 1) { setTimeout( () => { // 箭頭函數能好用? this.count++; console.log( "awesome?" ); }, 100 ); } } }; obj.cool(); // awesome? ``` 簡單的解釋是,當箭頭函數遇到它們的?`this`?綁定時,它們的行為與一般的函數根本不同。它們摒棄了?`this`?綁定的所有一般規則,而是將它們的立即外圍詞法作用域作為?`this`?的值,無論它是什么。 于是,在這個代碼段中,箭頭函數不會以不可預知的方式丟掉?`this`?綁定,它只是“繼承”?`cool()`?函數的?`this`?綁定(如果像我們展示的那樣調用它就是正確的!)。 雖然這使代碼更短,但在我看來,箭頭函數只不過是將一個開發者們常犯的錯誤固化成了語言的語法,這混淆了“this 綁定”規則與“詞法作用域”規則。 換一種說法:為什么要使用?`this`?風格的編碼形式來招惹麻煩和繁冗?只要通過將它與詞法作用域混合把它剔除掉就好。對于給定的一段代碼只采納一種方式或另一種看起來才是自然的,而不是在同一段代碼中將它們混在一起。 注意:?源自箭頭函數的另一個非議是,它們是匿名的,不是命名的。參見第三章來了解為什么匿名函數不如命名函數理想的原因。 在我看來,這個“問題”的更恰當的解決方式是,正確地使用并接受`this`機制。 ```source-js var obj = { count: 0, cool: function coolFn() { if (this.count < 1) { setTimeout( function timer(){ this.count++; // `this` 因為 `bind(..)` 所以安全 console.log( "more awesome" ); }.bind( this ), 100 ); // 看,`bind()`! } } }; obj.cool(); // more awesome ``` 不管你是偏好箭頭函數的新的詞法 this 行為,還是偏好經得起考驗的?`bind()`,重要的是要注意箭頭函數?不?僅僅是關于可以少打一些“function”。 它們擁有一種我們應當學習并理解的,*有意的行為上的不同*,而且如果我們這樣選擇,就可以利用它們。 現在我們完全理解了詞法作用域(和閉包!),理解詞法 this 應該是小菜一碟!
                  <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>

                              哎呀哎呀视频在线观看