2013-07-29 48 views
0

我有一個JavaScript對象,看起來像:

var MyObject = { 
    func1 : function() { 
     // Does something 
    }, 
    func2 : function() { 
     // Send an AJAX request out 
     $.post('', $('form').serialize(), function(response) { 
      // Call the first function 
      this.func1(); // Fails - this refers to the $.post request 
     }, 'json'); 
    } 
}; 

我怎樣才能讓this基準點到物體本身,不要$.post請求?

+0

通過不使用它在所有:'this.func1();'=>'func1的();' –

+1

@SnowBlind:不,這會導致一個'ReferenceError'。上面的'func2'範圍內沒有'func1'。 –

+1

@ T.J.Crowder呵呵,你說得對.. –

回答

2

如何引用對象從$。員額內()調用​​

使用變量名:

var MyObject = { 
    func1 : function() { 
     // Does something 
    }, 
    func2 : function() { 
     // Send an AJAX request out 
     $.post('', $('form').serialize(), function(response) { 
      // Call the first function 
      MyObject.func1(); // <== Using the name 
     }, 'json'); 
    } 
}; 

又見alexP's answer,從而推廣一個位(例如, ,如果將名稱MyObject更改爲其他名稱,則無需在兩個位置執行此操作)。

我怎樣才能使這個參考點到對象本身,而不是$.post請求?

如果你真的希望它是this,你可以做一對夫婦的方式。有jQuery的$.proxy

var MyObject = { 
    func1 : function() { 
     // Does something 
    }, 
    func2 : function() { 
     // Send an AJAX request out 
     //     Note ---------v 
     $.post('', $('form').serialize(), $.proxy(function(response) { 
      // Call the first function 
      this.func1(); // <== Using `this` now 
     }, 'json'), MyObject); 
     //  ^^^^^^^^^^----- note 
    } 
}; 

或者ES5的Function#bind

var MyObject = { 
    func1 : function() { 
     // Does something 
    }, 
    func2 : function() { 
     // Send an AJAX request out 
     $.post('', $('form').serialize(), function(response) { 
      // Call the first function 
      this.func1(); // <== Using `this` now 
     }, 'json').bind(MyObject)); 
     //  ^^^^^^^^^^^^^^^----- note 
    } 
}; 

請注意,並非所有的瀏覽器都ES5的bind的是,雖然它是可以勻的特徵之一(搜索「ES5墊片」爲幾個選項)。

+0

其實爲什麼'this'指的是給'$ .post'而不是'$ .post'本身的回調函數呢?因爲當你使用'var Foo function(){}聲明一個對象類型;'在函數中使用'this'就是指函數本身。編輯我會提出這個問題。 – Virus721

+1

你搖滾T.J.!正是我在尋找的答案 – FloatingRock

+0

@ Virus721:'this'很少,很少涉及函數。至於'$ .post',文檔沒有說明它在回調過程中設置了「this」。 –

3

最簡單的方法:

var MyObject = { 
    func1 : function() { 
     // Does something 
    }, 
    func2 : function() { 
     var self = this;  //self = MyObject-object 
     // Send an AJAX request out 
     $.post('', $('form').serialize(), function(response) { 
      // Call the first function 
      self.func1(); // #### NEW #### 
     }, 'json'); 
    } 
}; 
+0

+1不知道爲什麼我沒有包含這個選項,這是我通常會做的(直到var的名字!)。 –

+0

有時候更少更多:-)'var that = this;' – alexP

+0

@ alex:絕對如此。 –

0

使用AJAX上下文選項:

$.ajax({ 
    context:this, 
    type: "POST", 
    url: url, 
    data: data, 
    success: this.func1, 
    dataType: dataType 
});