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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                this提供了一種優雅的方式來隱式“傳遞”一個對象引用,因此可以將API設計得更加簡潔并且易于復用。隨著使用模式越來越復雜,顯式傳遞上下文對象會讓代碼變得混亂,而使用this則不會這樣。(this引用的是函數據以執行的環境對象) 對于this首先要明確的是this絕不是指向函數自身 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee140fa.jpg "") fun()被調用了一次,但是fun.count卻為0,并非是想象中的1,在執行fun(2)時,無意中定義了一個全局的count。很明顯,this指向的不是函數自身,否則,fun.count此時應該是1. 對于這個問題,我們可以引入fun的標識符替代this來引用函數對象。 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee2546e.jpg "") 在調用函數時,我們會將調出處執行環境對象傳給this,如此處調用fun(2),處在全局作用域中,因此this會指向window。既然這樣,我們可以通過強制this指向fun函數對象來解決這個問題,JS提供了兩個函數,apply()和call()函數。 apply()和call()函數的用途都是在特定的作用域中調用函數,換句話說,就是指定this對象的值。 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee3712e.jpg "") fun.call(fun,2);//強制this指向fun,即在調用fun時,將fun傳遞進去,作為this的值。 補充下apply()和call()的區別: apply()方法接收兩個參數:一個是在其中運行函數的作用域(可以理解為是this的值),另一個是參數數組(可以是arguments或者是數組的實例) call()方法與apply()方法的作用相同,區別僅在于接收參數的方式不同。第一個參數都是this的值,但是使用call()方法,必須要將傳遞的參數逐個列舉出來。 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee46250.jpg "") 此處,是否使用call()將window對象傳遞進去,并無影響。 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee5a02e.jpg "") 結果為NAN,因為全局對象中并無num1和num2的定義,那么為什么是NAN,而不是undefined呢,這就和類型轉換扯上關系了,在做加法運算時,會先將其轉化為Number類型,undefined類型不是一個數字,因此為NAN ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee6beec.jpg "") 結果為20,我們在全局對象中定義了num1和num2 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee7ff33.jpg "") 結果為20,盡管我們進行了強制綁定,但是可惜綁定的this是window對象。 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603ee934d2.jpg "") 結果依舊為20,是不是覺得有點奇怪了呢?我也很奇怪,這個完全是個意外,讓我有點搞不明白JS底層究竟是如何運作的,看起來參數似乎傳錯了,但是卻能得到結果(此處留一個疑問,待明白的時候再補充了)。我的本意是寫在下面這樣: ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603eea4336.jpg "") 結果為30,原因是因為我們利用call函數,使得this值指向了add.因此計算的是add.num1+add.num2,結果就是30. OK,現在我們再換一種寫法: ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603eeb6734.jpg "") 結果為20,我們在調用callAdd時,同樣使用call去指定this的值,但是卻沒有效果,這是為什么呢?有些資料上稱此為硬綁定(add.call(window, num1, num2))認為后續不能修改硬綁定的this.這種說法正確,但是有時并不是那么好理解。換個角度想,我們在調用callAdd時,使用call強制的使this值指向add,但是,callAdd函數內部并沒有使用this變量,它在調用add時,使用call函數將this綁定在了window上。因此我們在執行callAdd.caa(add, num1, num2)時,實際上就是計算window.num1+window.num2,結果顯然是20. 對于this我們還要明確一點是this在任何情況下都不會指向函數的詞法作用域。作用域“對象”無法通過JavaScript代碼訪問,它存在于JavaScript引擎內部。 ![這里寫圖片描述](https://box.kancloud.cn/2016-04-07_570603eec7e90.jpg "") 這個例子在《You Don’t Know JS》中被認為是試圖跨越邊界,使用this來隱式引用函數的詞法作用域,當然,對于此段代碼作者的意圖我并不了解,但是對于這段代碼,我認為我們只需要去關注this指向的究竟是什么,很明顯這兒的this都是指向全局對象window(非嚴格模式下)。通過this.bar()是不可能使得bar()函數中的作用域為foo()中的作用域的,this不可能會指向詞法作用域。 到了這兒,我們不免要思考,this究竟是什么這樣的問題。 那么this究竟是什么呢? 首先this是運行時進行綁定的,不是在編寫時綁定,它所指代的對象取決于函數被調用時的各種條件。this的綁定和函數聲明的位置沒有任何關系,只取決于函數的調用方式。 對于文中的疑點,如您知道原因,歡迎留言。 希望本文能對您學習JavaScript的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>

                              哎呀哎呀视频在线观看