2015-04-05 85 views
0

我很難理解如何在由$ interval調用的函數內處理值賦值。

鑑於以下代碼:

this.value = null; 
this.setSelection = function() { 
    this.value = Math.floor(Math.random()*11); 
}; 
this.isSelected = function(item) { 
    if(this.value === item) { 
     return "selected"; 
    } 
}; 

如果我打電話以這種方式$interval(this.setSelection, 2000);函數被稱爲所定義的間隔中的爲setSelection,但是所分配的值的範圍似乎是,使得實際this.value沒有改變,當摘要調用isSelected時,值仍然是null

但是,如果我直接調用該函數(如不正確的形式)$interval(this.setSelection(), 2000);值正確更新並且摘要運行isSelected它會識別新值。很明顯,由於$interval預計會有函數參考,因此間隔不會再次運行。

我也試過在匿名函數中包裝函數調用,但是這導致了一個錯誤,指出函數未定義。

所以我的問題是,爲什麼當我的函數被$ interval正確調用,我得到這個意外的結果?

回答

2

this取決於上下文。當致電$interval(this.setSelection, 2000)時,您將丟失this的上下文。該方法只是作爲一個函數被調用。當正在執行this.value = ...時,this與您所期望的完全不同(可能是包含的函數)。來解決這個

的一種方法是一個簡單的解決方法:

this.value = null; 
var self = this; 
this.setSelection = function() { 
    self.value = Math.floor(Math.random()*11); 
}; 

另一種解決方案是將功能結合this

$interval(this.setSelection.bind(this), 2000) 
+0

有趣。我認爲this應該在上下文中,因爲$ interval是一個角函數,它在控制器內使用$ this調用一個函數。如果函數調用是從摘要產生的,還是以明確的方式綁定,那麼「this」只會在上下文中出現? – msg45f 2015-04-05 09:43:02

+1

@ msg45f這與角度或摘要無關。這是一個JavaScript的東西。 'this'指的是封閉範圍,當你傳遞一個函數需要的方法時,對象的上下文將會丟失,並且你會得到一個獨立的函數,其中'this'意味着不同的東西。 – Sulthan 2015-04-05 10:38:41

+0

我明白了。我的困惑之源是,在一個單獨的控制器中,'ng-click'調用的方法在上下文中具有this,當它不是由'$ interval'調用的時候,我不確定出了什麼問題。 – msg45f 2015-04-05 10:50:11