2014-09-03 40 views
1

我寫一段JavaScript這樣的:如何在內部類中找到正確的「this」對象?

MyClassA.prototype.method1 = function(){ 
    //here, "this" refers to my instance of MyClassA 
    $.ajax({ 
     url : "http://foo.com/foo", 
     success: function(data) { 
      //OMG! "this" now refers to another object 
     } 
    } 
}); 

我需要訪問的MyClassAthis元素在success功能。在Java中,可以使用MyClassA.this來指代內部類中的右邊的this實例。有沒有類似的方式來在JavaScript中做到這一點?

MyClassA.prototype.method1 = function(){ 
    var myClassAThis=this; 
    $.ajax({ 
     url : "http://foo.com/foo", 
     success: function(data) { 
      myClassAThis.method2(); 
      ... 
     } 
    } 
}); 

的標準方式在這樣的情況下繼續嗎?

+0

你自己回答,這是正確的方法來做,另一種方法是與綁定。你可以在這裏查看http:// stackoverflow。/我的問題/ 25137044 /這個屬性範圍在javascript/25137098#25137098 ... – 2014-09-03 11:16:02

+0

我沒有看到你的代碼中的任何內部類? 'MyClassA'是你正在使用的唯一構造函數。 – Bergi 2014-09-03 12:30:08

+0

感謝您的複製鏈接! – julien 2014-09-03 13:03:03

回答

4

常見模式是將this設置爲變量,是的。但是,您所描述的內容會創建隱含的全局變量。爲了防止它,使用var關鍵字:

var that = this; 

後來

that.method2(); 

另一個解決方案是一個封閉。

MyClassA.prototype.method1 = function(){ 
    (function(that) { 
     $.ajax({ 
      url : "http://foo.com/foo", 
      success: function(data) { 
       that.method2(); 
       ... 
      } 
     }); 
    })(this); 
}); 
+0

斑點:我忘記了「var」。 – julien 2014-09-03 11:48:48

+0

這個封閉看起來非常不必要。它也是更長的路... – Bergi 2014-09-03 12:34:32

+0

感謝您的建議。我不喜歡關閉 - 它使代碼難以閱讀。 – julien 2014-09-03 13:04:37

0

我寧願做

MyClassA.prototype.method1 = function(){ 
    return $.ajax({ 
    url : "http://foo.com/foo"  
    } 
}); 

MyClassA.prototype.method2 = function(){ 
    this.method1().done(function(data) { 
    //do method2 code 
    }) 

}); 
+1

請添加一些說明,使其成爲一個很好的答案。 – 2014-09-03 12:17:05

+1

這不適用,因爲'method2()'不應該隱式地調用'method1()',但是相反。 – Bergi 2014-09-03 12:33:09

0
MyClassA.prototype.method1 = function(){ 
myClassAThis=this; //1 
$.ajax({ 
    url : "http://foo.com/foo", 
    success: function(data) { 
     myClassAThis.method2(); //2 
     ... 
    } 
} 
}); 

哪些對象「這」指的是在任何任何一點在你的代碼實際上取決於你如何調用該函數。

在這種情況下, 1.作爲通常的功能。例子: - functionName() 2.或作爲方法調用。例如: - 新someOuterFunction()someInnerFunction()

(注意:有兩個其他類型的調用)

在第一種情況中,此參數被隱式地傳遞到函數範圍是全局對象上下文,在瀏覽器中是窗口對象。

在第二種情況下,該參數實際上指的是函數被調用的實例,在這種情況下,它將是someOuterFunction實例。

記住這兩點, 如果你看看上面的代碼// 1,那麼這個「引用」取決於你調用method1的方式。如果你碰巧把它作爲普通函數調用,那麼它就是指全局對象,因此它將在全局上下文中尋找method2,而不是MyClassA函數。

在您碰巧通過引用MyClassA的實例來調用method1作爲方法調用,那麼「this」實際上指向該實例。然後在MyClassA實例(或函數)中搜索Method2並調用它。

希望幫助!或至少清除困惑.. :)

+0

在閱讀你的答案之前,我並沒有感到困惑......現在我有點兒了。不管怎麼說,還是要謝謝你! – julien 2014-09-03 11:54:54

+0

你的'myClassAThis'是一個隱式的全局。 – Bergi 2014-09-03 12:32:01

相關問題