談談我對JS中this的理解


好吧,JS中,作用域、閉包和原型都說了,今天我們就再談談this吧,this我更傾向於把它理解成為一個特殊變量,JS解釋器在創建任何活動對象時(參考前面關於作用域的博文),都會創建一個this變量,並且將它指向一個對象(可編碼干預)。下面以代碼為例進行講解。

  1. 處於全局作用域下的this:
    this;/*window*/
    
    var a = {name: this}/*window*/
    
    var b = [this];/*window*/

     在全局作用域下,this默認指向window對象。

  2. 處在函數中的this,又分為以下幾種情況:
    1. 一般定義的函數,然后一般的執行:
      var a = function(){
        
         console.log(this);
      }
      a();/*window*/

      this還是默認指向window。

    2. 一般定義,用new調用執行:
      var a = function(){
        
         console.log(this);
      }
      new a();/*新建的空對象*/

      這時候讓this指向新建的空對象,我們才可以給空對象初始化自有變量(參照之前關於原型的博文)。

    3. 作為對象屬性的函數,調用時:
      var a = {
                 f:function(){
                     console.log(this)
                   }
               }
      a.f();/*a對象*/

      這時候this指向調用f函數的a對象。

  3. 通過call()和apply()來改變this的默認引用:
    var b = {id: 'b'};
    var a = {
               f:function(){
                   console.log(this)
                 }
             }
    a.f.call(b);/*window*/

    所有函數對象都有的call方法和apply方法,它們的用法大體相似,f.call(b);的意思是,執行f函數,並將f函數執行期活動對象里的this指向b對象,這樣標示符解析時,this就會是b對象了。不過調用函數是要傳參的。所以,f.call(b, x, y);    f.apply(b, [x, y]);好吧,以上就是用call方法執行f函數,與用apply方法執行f函數時傳參方式,它們之間的差異,大家一目了然:apply通過數組的方式傳遞參數,call通過一個個的形參傳遞參數。

  4. 一些函數特殊執行情況this的指向問題:
    1. setTimeout()和setInverval():

      var a = function(){
        console.log(this);
      }
      
      setTimeout(a,0);/*window*/

      setInterval()類似。

       

    2. dom模型中觸發事件的回調方法執行中活動對象里的this指向該dom對象。

this就總結到這里,如有錯誤,歡迎指正O(∩_∩)O


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM